2012-06-30 3 views
2

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()   
+0

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

+0

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. –

+0

"@ 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

Répondre

11

Lorsque vous calculez x=x+x plusieurs milliers de fois, x devient un très grand. Vous mesurez le temps qu'il faut pour ajouter deux très grands nombres.

+0

Merci! Je vois le problème maintenant! – Wang

+0

Cela semble être le cas. mettre x à 0 au lieu de 47 initialement et ils prennent le même temps. – cobbal

+0

ouais, si vous ajoutez une ligne avec 'x = x + x; x = 1' dessus, tout disparaît complètement –

Questions connexes