Foros del Web » Programando para Internet » Python »

Formas de optimizar un script en python

Estas en el tema de Formas de optimizar un script en python en el foro de Python en Foros del Web. Hola, estoy resolviendo algunos problemas en http://projecteuler.net/ , y algunos problemas dejan en evidencia la pobreza de mis scripts. De ahí me surgió la necesidad ...
  #1 (permalink)  
Antiguo 05/12/2012, 12:48
ger84
Invitado
 
Mensajes: n/a
Puntos:
Formas de optimizar un script en python

Hola, estoy resolviendo algunos problemas en http://projecteuler.net/, y algunos problemas dejan en evidencia la pobreza de mis scripts. De ahí me surgió la necesidad de trabajar bastante en los algoritmos y en optimizarlos, sobre todo en los problemas acerca de factorización.

Me surgieron algunas dudas, por ejemplo:
  • ¿Es significativa la diferencia entre crear un bucle con for ..xrange a crearlo con un while?
  • ¿Existirán métodos/funciones mas rápidas que len(), divmod(), str(), int(), list.index(), las funciones de itertools, math etc?
  • ¿Es significativa la diferencia entre usar los métodos de los strings para búsqueda y manipulación en un texto, a una expresión regular?
  • ¿Cuan rápida es la carga de librerías C con ctypes y la ejecución de funciones?, es decir, ¿ganaré velocidad si hago esto?
  • ¿Cómo puedo medir la velocidad de ejecución de un script python?
  • ¿Existen interpretes mas veloces para python que el que trae por defecto? (no importa mucho la estabilidad, es para hacer estos cálculos)

Última edición por ger84; 05/12/2012 a las 12:59
  #2 (permalink)  
Antiguo 05/12/2012, 15:16
ger84
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Formas de optimizar un script en python

encontré respuestas para la mayoría
Cita:
  • ¿Es significativa la diferencia entre crear un bucle con for ..xrange a crearlo con un while?
http://grokbase.com/t/python/tutor/1...versus-x-range
Cita:
  • ¿Es significativa la diferencia entre usar los métodos de los strings para búsqueda y manipulación en un texto, a una expresión regular?
http://www.diveintopython.net/perfor...pressions.html
Cita:
  • ¿Cuan rápida es la carga de librerías C con ctypes y la ejecución de funciones?, es decir, ¿ganaré velocidad si hago esto?
http://prabhuramachandran.blogspot.c...vs-c-swig.html aunque usa swig
Cita:
  • ¿Cómo puedo medir la velocidad de ejecución de un script python?
http://www.diveintopython.net/perfor...ing/index.html
Cita:
  • ¿Existen interpretes mas veloces para python que el que trae por defecto? (no importa mucho la estabilidad, es para hacer estos cálculos)
http://pypy.org/ (debo probarlo)
  #3 (permalink)  
Antiguo 05/12/2012, 15:17
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: Formas de optimizar un script en python

Cita:
Iniciado por ger84 Ver Mensaje
¿Es significativa la diferencia entre crear un bucle con for ..xrange a crearlo con un while?
Si, si la hay. Puedes crear 2 funciones y compararlas. Puedes compararlas con timeit o con dis

Cita:
Iniciado por ger84 Ver Mensaje
¿Existirán métodos/funciones mas rápidas que len(), divmod(), str(), int(), list.index(), las funciones de itertools, math etc?
No creo que existan funciones mas rápidas a menos que uses numpy para operaciones con matrices.

Cita:
Iniciado por ger84 Ver Mensaje
¿Es significativa la diferencia entre usar los métodos de los strings para búsqueda y manipulación en un texto, a una expresión regular?
De preferencia usa los métodos de los strings, a menos que necesites capturar text es mejor usar expresiones regulares.

Cita:
Iniciado por ger84 Ver Mensaje
¿Cuan rápida es la carga de librerías C con ctypes y la ejecución de funciones?, es decir, ¿ganaré velocidad si hago esto?
Si, si ganaras velocidad. Pero digamos que vas en contra de 2 principios.

Cita:
Iniciado por ger84 Ver Mensaje
¿Cómo puedo medir la velocidad de ejecución de un script python?
Con el modulo timeit

Cita:
Iniciado por ger84 Ver Mensaje
¿Existen interpretes mas veloces para python que el que trae por defecto? (no importa mucho la estabilidad, es para hacer estos cálculos)
PyPy

Aclaraciones:
Primera regla de la optimización en programación:
No lo hagas.

Segunda regla de la optimización en programación (solo para expertos):
No lo hagas. (Aun!).

Yo también resolví algunos cuantos problemas en project euler, todos los que resolví fueron con python a secas. La clave esta en tener un buen set de algoritmos y creatividad.



Solo recuerda una nota al final de la pagina de problemas:
Cita:
Iniciado por ProjectEuler.net
Please do not contact Project Euler if you are unable to solve a particular problem. If you can't solve it, then you can't solve it!

Última edición por razpeitia; 05/12/2012 a las 15:23
  #4 (permalink)  
Antiguo 05/12/2012, 18:07
ger84
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Formas de optimizar un script en python

Cita:
Iniciado por razpeitia Ver Mensaje
Aclaraciones:
Primera regla de la optimización en programación: No lo hagas.
Muy buena respuesta y ya que estamos, ¿dirías que ésta es una prueba "justa"?:
Código Python:
Ver original
  1. #loopfunctions.py
  2. def fwhile(looplimit):
  3.     k=0
  4.     while k < looplimit:
  5.         k += 1
  6. def frange(looplimit):
  7.     b = 0
  8.     for k in range(looplimit):
  9.         b += 1
  10. def fxrange(looplimit):
  11.     b = 0
  12.     for k in xrange(looplimit):
  13.         b += 1
Código Python:
Ver original
  1. #loopfunctiontest.py
  2. import timeit
  3. import loopfunctions
  4.  
  5.  
  6. def test_time_loops(looplimit,repeat_test,fn_calls):
  7.     print "looplimit: %d | test repetition: %d | function calls: %d\n" % (looplimit,repeat_test,fn_calls)
  8.     function0 = "fwhile(%d)" % looplimit
  9.     t0 = timeit.Timer(function0, "from loopfunctions import fwhile")
  10.     times0 = t0.repeat(repeat_test,fn_calls)
  11.     print "ffwhile time test \n  max: %f\n  min: %f\n  typ: %f\n" % (max(times0),min(times0),sum(times0)/len(times0))
  12.  
  13.     function1 = "frange(%d)" % looplimit
  14.     t1 = timeit.Timer(function1, "from loopfunctions import frange")
  15.     times1 = t1.repeat(repeat_test,fn_calls)
  16.     print "frange time test \n  max: %f\n  min: %f\n  typ: %f\n" % (max(times1),min(times1),sum(times1)/len(times1))
  17.  
  18.     function2 = "fxrange(%d)" % looplimit
  19.     t2 = timeit.Timer(function2, "from loopfunctions import fxrange")
  20.     times2 = t2.repeat(repeat_test,fn_calls)
  21.     print "fxrange time test \n  max: %f\n  min: %f\n  typ: %f\n" % (max(times2),min(times2),sum(times2)/len(times2))
  22.  
  23.  
  24. print "\nTest small arguments\n"
  25. test_time_loops(200,5,1000)
  26. print "-" * 20
  27. print "\nTest big arguments\n"
  28. test_time_loops(2000000,2,10)
  29. #test_time_loops(sys.maxint,1,1)
Código consola:
Ver original
  1. >>>
  2. Test small arguments
  3.  
  4. looplimit: 200 | test repetition: 5 | function calls: 1000
  5.  
  6. fwhile time test
  7.   max: 0.013561
  8.   min: 0.012781
  9.   typ: 0.013071
  10.  
  11. frange time test
  12.   max: 0.015569
  13.   min: 0.013655
  14.   typ: 0.014201
  15.  
  16. fxrange time test
  17.   max: 0.017101
  18.   min: 0.015968
  19.   typ: 0.016563
  20. --------------------
  21. Test big arguments
  22.  
  23. looplimit: 2000000 | test repetition: 2 | function calls: 10
  24.  
  25. fwhile time test
  26.   max: 1.327053
  27.   min: 1.308638
  28.   typ: 1.317846
  29.  
  30. frange time test
  31.   max: 1.873991
  32.   min: 1.761235
  33.   typ: 1.817613
  34.  
  35. fxrange time test
  36.   max: 1.211450
  37.   min: 1.202643
  38.   typ: 1.207047
  39.  
  40. >>>

Última edición por ger84; 06/12/2012 a las 12:15

Etiquetas: formas, import
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 14:25.