J'ai récemment utilisé le module timeit pour faire un test de performance très simple du python. Le résultat m'a vraiment étonné: le temps consommé par x=x+x
est d'environ 125 fois de x+x
ou y=x+x,
pourquoi ?! J'espère vraiment que quelqu'un me donnera une idée à ce sujet, peut-être que j'ai utilisé le timeit faux? Merci!le python x = x + x est 120 fois plus lent que y = x + x ?! Pourquoi?
S'il vous plaît notez que y=x+x;x=y
est aussi lent que x=x+x
... mais le x=x+47
est aussi rapide que x+x
testBasicOps()
testcase = "pass", time lapse: 0.001487secs
testcase = "x = 47", laps de temps: 0.002424secs
testcase = "x = 94", laps de temps: 0.002423secs
testcase = "x = 47 * 2", laps de temps: 0.002423secs
testcase = "x + x", laps de temps: 0.003922secs
testcase = "x * 2", laps de temps: 0.005307secs
testcase = "x = x + x", laps de temps: 0.497974secs
testcase = "x = x * 2", Accéléré: 0.727506secs
testcase = "x = x + 47", time lapse: 0.005770secs
testcase = "x = 47 + x", laps de temps: 0.004442secs
testcase = "x + = x" , laps de temps: 0.498920secs
testcase = "y = x + x", laps de temps: 0.004102secs
testcase = "y = x * 2", laps de temps: 0.006327secs
testcase = "y = x + x
x = y", laps de temps: 0.499644secs
testcase = "x + x
y = x", laps de temps: 0.004948secs
TestCase = "x + x
x = y", laps de temps: 0.005126secs
testcase = "y = 10
x = y", laps de temps: 0.003351secs
testcase = "pass", laps de temps: 0.001487secs
Le code je:
import timeit
import numpy as npy
def testBasicOps():
timeitSetup="""
x=47
y=0
"""
testCases=['pass','x=47',\
'x=94','x=47*2'\
,'x+x','x*2'\
,'x=x+x','x=x*2'\
,'x=x+47','x=47+x'\
,'x+=x','y=x+x'\
,'y=x*2','y=x+x\nx=y'\
,'x+x\ny=x','x+x\nx=y'\
,'y=10\nx=y']
minT=[]
tests=[]
for i in testCases:
tests.append(timeit.Timer(i,setup=timeitSetup))
minT.append(npy.mean(tests[-1].repeat(10,int(1e5))))
print 'testcase=\"%s\", time lapse:%fsecs'%(i,minT[-1])
def main():
print "#"*10
print "testBasicOps()"
testBasicOps()
if __name__ == '__main__':
main()
Quelle version de python utilisez-vous? J'ai le sentiment que cela est causé par ce que les notes casevh couplé avec un problème de version. Je suppose que vous êtes sur 2.6 ou moins. – inspectorG4dget
Je voudrais aussi mentionner que le code est très "Java-ish" et que le compteur Python est intuitif ... vous n'avez pas besoin des suites de lignes ... juste un chemin avec un ',' pour séparer les éléments de liste et partir de là. .. par exemple. dans ''pass' ',' x = 47 ', \' le' \ 'est inutile. –
"@ inspectorG4dget: Quelle version de python utilisez-vous?" sys.version = 2.7.2+ (valeur par défaut, 4 oct 2011, 20:06:09) [GCC 4.6.1] Merci à tous, particulièrement @casevh! J'ai corrigé le problème en ajoutant "x = 47;" dans chaque test. C'est définitivement un problème d'utilisation du module timeit comme je m'y attendais: D – Wang