Foros del Web » Programando para Internet » Python »

condicionales. Existe alguna diferencia en la manera de estructurarlos?

Estas en el tema de condicionales. Existe alguna diferencia en la manera de estructurarlos? en el foro de Python en Foros del Web. digamos que tengo una variable llamada "direction" la cual puede tener cualquiera de los siguientes valores: "ZPXP", "ZMXP", "ZPXM", "ZMXM", "ZPYP", "ZMYP", "ZPYM", "ZMYM", "XPZP", ...
  #1 (permalink)  
Antiguo 21/03/2011, 17:18
AxL456
Invitado
 
Mensajes: n/a
Puntos:
condicionales. Existe alguna diferencia en la manera de estructurarlos?

digamos que tengo una variable llamada "direction" la cual puede tener cualquiera de los siguientes valores:

"ZPXP", "ZMXP", "ZPXM", "ZMXM", "ZPYP", "ZMYP", "ZPYM", "ZMYM", "XPZP", "XMXZ", "XPZM", "XMXZ", "XPYP", "XMYP", "XPYM", "XMYM", "YPXP", "YMXP", "YPXM", "YMXM", "YPZP", "YMZP", "YPZM", "YMZM"

existe alguna manera de estructurar el flujo de los condicionales para mejorar el performance?

por ejemplo, si lo estructuro de esta manera, consigo que el numero de pasos sea menor?:

Código Python:
Ver original
  1. if direction[0] == "Z":
  2.     if direction[:2] == "ZP":
  3.         if direction == "ZPXM":
  4.             pass
  5.         elif direction == "ZPYP":
  6.             pass
  7.         elif direction == "ZPYM":
  8.             pass
  9.         elif direction == "ZPXP":
  10.             pass
  11.         else:
  12.             pass
  13.     elif direction[:2] == "ZM":
  14.         if direction == "ZMXM":
  15.             pass
  16.         elif direction == "ZMYP":
  17.             pass
  18.         elif direction == "ZMYM":
  19.             pass
  20.         elif direction == "ZMXP":
  21.             pass
  22.         else:
  23.             pass
  24.     else:
  25.         pass
  26. elif direction[0] == "Y":
  27.     if direction[:2] == "YP":
  28.         if direction == "YPZM":
  29.             pass
  30.         elif direction == "YPXM":
  31.             pass
  32.         elif direction == "YPZP":
  33.             pass
  34.         elif direction == "YPXP":
  35.             pass
  36.         else:
  37.             pass
  38.     elif direction[:2] == "YM":
  39.         if direction == "YMZM":
  40.             pass
  41.         elif direction == "YMXM":
  42.             pass
  43.         elif direction == "YMZP":
  44.             pass
  45.         elif direction == "YMXP":
  46.             pass
  47.         else:
  48.             pass
  49.     else:
  50.         pass
  51. elif direction[0] == "X":
  52.     if direction[:2] == "XP":
  53.         if direction == "XPYM":
  54.             pass
  55.         elif direction == "XPZM":
  56.             pass
  57.         elif direction == "XPYP":
  58.             pass
  59.         elif direction == "XPZP":
  60.             pass
  61.         else:
  62.             pass
  63.     elif direction[:2] == "XM":
  64.         if direction == "XMZM":
  65.             pass
  66.         elif direction == "XMYM":
  67.             pass
  68.         elif direction == "XMZP":
  69.             pass
  70.         elif direction == "XMYP":
  71.             pass
  72.         else:
  73.             pass
  74.     else:
  75.         pass
  76. else:
  77.     pass

si no estoy equivocado para este caso el numero mínimo de pasos que se pueden ejecutar es 3 (si "direction" == "ZPXM") y el numero máximo seria 9 (si "direction" == "XMYP")


otra forma de estructurarlo seria simplemente probar para todos y cada uno de los pasos:
Código Python:
Ver original
  1. if direction == "ZPXM":
  2.     pass
  3. elif direction == "ZPYP":
  4.     pass
  5. elif direction == "ZPYM":
  6.     pass
  7. elif direction == "ZPXP":
  8.     pass
  9. elif direction == "ZMXM":
  10.     pass
  11. elif direction == "ZMYP":
  12.     pass
  13. elif direction == "ZMYM":
  14.     pass
  15. elif direction == "ZMXP":
  16.     pass
  17. elif direction == "YPZM":
  18.     pass
  19. elif direction == "YPXM":
  20.     pass
  21. elif direction == "YPZP":
  22.     pass
  23. elif direction == "YPXP":
  24.     pass
  25. elif direction == "YMZM":
  26.     pass
  27. elif direction == "YMXM":
  28.     pass
  29. elif direction == "YMZP":
  30.     pass
  31. elif direction == "YMXP":
  32.     pass
  33. elif direction == "XPYM":
  34.     pass
  35. elif direction == "XPZM":
  36.     pass
  37. elif direction == "XPYP":
  38.     pass
  39. elif direction == "XPZP":
  40.     pass
  41. elif direction == "XMZM":
  42.     pass
  43. elif direction == "XMYM":
  44.     pass
  45. elif direction == "XMZP":
  46.     pass
  47. elif direction == "XMYP":
  48.     pass
  49. else:
  50.     pass

para este caso el minimo seria 1, y el maximo seria 24..

bueno la pregunta es, estructurar el codigo de la primera forma seria "mejor" que de la segunda?, existe alguna mejor manera de estructurar esto?
  #2 (permalink)  
Antiguo 21/03/2011, 17:29
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: condicionales. Existe alguna diferencia en la manera de estructurarlos?

Lo mejor seria usar un diccionario de la siguiente manera:
Código Python:
Ver original
  1. d = {'ZPXM': fun1, 'ZPYP':fun2, ..., 'XMYP':fun24}
  2. d[direction]()
  #3 (permalink)  
Antiguo 21/03/2011, 17:40
AxL456
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: condicionales. Existe alguna diferencia en la manera de estructurarlos?

Cita:
Iniciado por razpeitia Ver Mensaje
Lo mejor seria usar un diccionario de la siguiente manera:
Código Python:
Ver original
  1. d = {'ZPXM': fun1, 'ZPYP':fun2, ..., 'XMYP':fun24}
  2. d[direction]()
jajaja verdad que si, no se me había ocurrido..

ahora, cual seria la desventaja de ese metodo? me gustaria saber bien los pros y cons antes de aplicarlo asi a ciegas..

muchas gracias!...
  #4 (permalink)  
Antiguo 21/03/2011, 18:38
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: condicionales. Existe alguna diferencia en la manera de estructurarlos?

Bueno faltaría hacer un cambio:
Código Python:
Ver original
  1. d.get(direction, default_function)()

Ventajas:
Rápido

Desventajas:
Difícil de comprender para un principiante
  #5 (permalink)  
Antiguo 21/03/2011, 21:10
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: condicionales. Existe alguna diferencia en la manera de estructurarlos?

Quería agregar que este método es más rápido porque un diccionario no utiliza comparación de cadenas como los if-else sino que usa una tabla hash (recordando que la búsqueda en una tabla hash es O(1))

De todas formas habría que ver qué tantas veces tenés que hacer esa elección entre las opciones, si tenés que hacerla una vez en todo el ciclo de ejecución del programa no vas a notar la diferencia.

Saludos.
  #6 (permalink)  
Antiguo 21/03/2011, 21:20
AxL456
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: condicionales. Existe alguna diferencia en la manera de estructurarlos?

Cita:
Iniciado por razpeitia Ver Mensaje
Bueno faltaría hacer un cambio:
Código Python:
Ver original
  1. d.get(direction, default_function)()

Ventajas:
Rápido

Desventajas:
Difícil de comprender para un principiante
muchas gracias razpeita!

Cita:
Iniciado por AlvaroG Ver Mensaje
Quería agregar que este método es más rápido porque un diccionario no utiliza comparación de cadenas como los if-else sino que usa una tabla hash (recordando que la búsqueda en una tabla hash es O(1))

De todas formas habría que ver qué tantas veces tenés que hacer esa elección entre las opciones, si tenés que hacerla una vez en todo el ciclo de ejecución del programa no vas a notar la diferencia.

Saludos.
pues si se ejecuta varias veces...

esa parte del codigo es para una GUI que estoy creando, y ese pedazo se ejecuta cada vez que se dibuja una sección nueva en la GUI..

muchas gracias por el dato!..
  #7 (permalink)  
Antiguo 22/03/2011, 17:41
 
Fecha de Ingreso: marzo-2010
Ubicación: Mérida, Venezula
Mensajes: 73
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: condicionales. Existe alguna diferencia en la manera de estructurarlos?

Cita:
Iniciado por razpeitia Ver Mensaje
Bueno faltaría hacer un cambio:
Código Python:
Ver original
  1. d.get(direction, default_function)()

Ventajas:
Rápido

Desventajas:
Difícil de comprender para un principiante
Definitivamente, todavia estoy pollito.
  #8 (permalink)  
Antiguo 22/03/2011, 18:45
AxL456
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: condicionales. Existe alguna diferencia en la manera de estructurarlos?

Cita:
Iniciado por SamuraiBlanco Ver Mensaje
Definitivamente, todavia estoy pollito.
no es tan complicado...

en los diccionarios, los valores de las llaves pueden ser cadenas, numeros, listas, tuplas o tambien otras funciones (clases todavia no he probado, no se si se podran)..

el .get() lo unico que hace es dar una funcion predeterminada para cuando la llave que estas usando no se encuentre en el diccionario.

este ejemplo puede ayudar a ver las cosas un poco mas claras..

Código Python:
Ver original
  1. def bar(): print "bar"
  2. def foo(): print "foo"
  3.  
  4. dict1 = {'a': bar, 'b': bar}
  5.  
  6. dict1.get('a')()
  7. dict1.get('c', foo)()

Etiquetas: condicional
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:07.