2012-07-03 20 views
7

Sto usando Enthought EPD-Free 7.3-1 su una piccola funzione, e quando si taglia/incolla in una sessione interattiva (PyLab) ed eseguirla, ci vuole meno di un secondo. Quando eseguo lo stesso codice dalla riga di comando "python probtest.py", sono necessari più di 16 secondi.shell interattiva python 16 volte più veloce della riga di comando - cosa c'è che non va?

Ho confermato che entrambi stanno usando lo stesso ambiente Python. Forse correlato (forse no) ma nella directory con il file .py, non c'è un file .pyc ... nessuno degli script Python che ho eseguito di recente ha associato i file .pyc. Ho controllato i permessi di lettura/scrittura per la cartella, usato "permessi di riparazione" (Mac OSX-Lion) e disinstallato/reinstallato EPD_Free python, ma senza fortuna.

Sono in perdita per quello che potrebbe essere la causa. Il codice che sto usando (semplice test del numero x di dadi, alla ricerca di Sixes almeno 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 

Come trovi il motivo per cui la linea di comando python è molto più lento? Grazie in anticipo.

risposta

9

Ah, questo sembra familiare. Se si sta utilizzando un'interfaccia pylab, è probabilmente importato il numpy sum nell'ambito, ignorando il builtin. somma di NumPy sarà molto più veloce (l'unica differenza tra i due codici è che ho aggiunto from numpy import sum al secondo):

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 

È possibile verificare questo controllando per vedere se sum is np.sum.

+0

Grazie! Questo era esattamente il problema! Grazie mille, mi hai salvato la sanità mentale! –

+0

Nessun problema. La settimana scorsa ho dovuto lottare con un bug perché ero pigro e ha fatto "da numpy import *", che ha sostituito il builtin 'any' con' numpy.any', dando un comportamento diverso quasi impossibile da eseguire il debug guardando il codice stesso. Quindi era nella mia mente .. – DSM

3

Abbiamo rilevato questo problema con IronPython. La riga di comando stava importando un sacco di elementi per impostazione predefinita per ogni chiamata. E la shell interattiva li ha caricati una volta ed era pronto!

Quindi controllare quali importazioni vengono eseguite per impostazione predefinita e rimosse dal cronometraggio.

+0

Grazie, e questo potrebbe essere parte di esso, ma il tempo in più sembra aumentare in modo lineare man mano che aumenta il numero di iterazioni ... riducendo numThrows da 5000 a 500 riduce il tempo a meno di 2 secondi per la riga di comando, poi torna a 16 secondi quando numThrows risale a 5000. –

Problemi correlati