2012-07-03 6 views
7

Estoy usando Enthought EPD-Free 7.3-1 en una función pequeña, y cuando corto/pego en una sesión interactiva (PyLab) y lo ejecuto, toma menos de un segundo. Cuando ejecuto el mismo código desde la línea de comando "python probtest.py" toma más de 16 segundos.shell interactivo python 16 veces más rápido que la línea de comandos: ¿qué ocurre?

He confirmado que ambos están utilizando el mismo entorno de python. Tal vez relacionado (tal vez no), pero en el directorio con el archivo .py, no hay un archivo .pyc ... ninguno de los scripts de Python que he hecho recientemente tiene archivos .pyc asociados. Revisé los permisos de lectura/escritura para la carpeta, utilicé "permisos de reparación" (Mac OSX-Lion) y desinstalé/reinstalé EPD_Free python, pero no tuve suerte.

No sé cuál podría ser la causa. El código que estoy usando (simple prueba de x número de dados, en busca de al menos seises y):

import numpy as np 
import sys 

def runTest(numDice, numSixes, numThrows = 10000): 
    nSuccess = 0 
    for i in range(numThrows): 
     dList = np.random.randint(1,7,numDice) 
     if sum(dList==6) >= numSixes: 
      nSuccess += 1 
    return float(nSuccess)/numThrows 

print runTest(900,150,5000) 
print sys.version 

Alguna idea acerca de por qué la pitón línea de comandos es mucho más lento? Gracias por adelantado.

Respuesta

9

Ah, este parece familiar. Si está utilizando una interfaz de pylab, probablemente se haya importado el numpy sum en el alcance, anulando el built-in. suma de numpy será mucho más rápido (la única diferencia entre los dos códigos siguientes es que he añadido a la segunda from numpy import sum):

localhost-2:coding $ time python sumtime.py 
0.5106 
2.7.2 (v2.7.2:8527427914a2, Jun 11 2011, 15:22:34) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] 

real 0m20.313s 
user 0m19.955s 
sys 0m0.247s 
localhost-2:coding $ time python sumtime_with_np_sum.py 
0.5118 
2.7.2 (v2.7.2:8527427914a2, Jun 11 2011, 15:22:34) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] 

real 0m0.572s 
user 0m0.345s 
sys 0m0.220s 

Esto se puede comprobar mediante la comprobación para ver si sum is np.sum.

+0

¡Gracias! ¡Ese fue exactamente el problema! ¡Muchas gracias, has salvado mi cordura! –

+0

Sin preocupaciones. La semana pasada tuve que lidiar con un error porque era flojo e hice 'from numpy import *', que reemplazó el compilado 'any' con' numpy.any', lo que hace que un comportamiento diferente sea casi imposible de depurar al mirar el código en sí. Así que estaba en mi mente ... – DSM

3

Encontramos este problema con IronPython. La línea de comando importaba muchos elementos de forma predeterminada para cada invocación. ¡Y el caparazón interactivo los cargó una vez y estaba listo!

Por lo tanto, compruebe qué importaciones se realizan de forma predeterminada y quítelas del calendario.

+0

Gracias, y eso puede ser parte de esto, pero el tiempo extra parece aumentar linealmente a medida que aumenta el número de iteraciones ... reduciendo numThrows de 5000 a 500 reduce el tiempo a menos de 2 segundos para la línea de comando, luego vuelve a 16 segundos cuando numThrows vuelve a 5000. –

Cuestiones relacionadas