2012-06-30 67 views
2

我最近使用timeit模塊來做一個非常簡單的python性能測試。結果真的讓我目瞪口呆:x=x+x消耗的時間約爲125次x+xy=x+x,爲什麼?!我真的希望有人會給我一些線索,也許我用錯了嗎?謝謝!python x = x + x比y = x + x ?!慢120倍爲什麼?

請注意y=x+x;x=yx=x+x慢......但x=x+47是儘可能快地x+x

testBasicOps()

測試用例= 「通行證」,時間間隔:0.001487secs

testcase =「x = 47」,時間流逝:0.002424secs

testcase =「x = 94」,時間間隔:0.002423secs

測試用例= 「×= 47 * 2」,時間流逝:0.002423secs

測試用例= 「X + x」 的,時間經過:0.003922secs

測試用例= 「×* 2」,時間流逝:0.005307secs

測試用例= 「X = X + x」 的,時間經過:0.497974secs

測試用例= 「X = X * 2」,時間流逝:0.727506secs

測試用例= 「X = X + 47」,時間流逝:0.005770secs

測試用例= 「X = 47 + x」 的,時間經過:0.004442secs

測試用例= 「X + = x」 的,時間流逝:0.498920secs

測試用例= 「Y = X + x」 的,時間經過:0.004102secs

測試用例= 「Y = X * 2」,時間流逝:0.006327secs

測試用例= 「Y = X + X

X = Y」,時間流逝:0.499644secs

測試用例= 「X + X3

Y = X」,時間流逝: 0.004948secs

測試用例= 「X + X3

X = Y」,時間流逝:0.005126secs

測試用例= 「Y = 10

X = Y」,時間流逝:0.003351secs

測試用例= 「通過」,時間流逝:0。001487secs

我使用的代碼:

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

你使用的是什麼版本的Python?我有一種感覺,這是由什麼casevh筆記加上版本問題引起的。我猜你在2.6或更低。 – inspectorG4dget

+0

我還會提到代碼非常「Java-ish」,反Python很直觀......你不需要行延續......只是用','來分隔列表元素並從那裏開始。 ..例如。在'傳','x = 47'中,\''''是不必要的。 –

+0

「@ inspectorG4dget:你使用的是什麼版本的Python?」 sys.version = 2.7.2+(默認,2011年10月4日,20:06:09) [GCC 4.6.1] 謝謝大家,尤其是@casevh!我通過添加「x = 47;」來解決問題在每個測試中。這絕對是timeit模塊的使用問題,因爲我期望:D – Wang

回答

11

當你計算x=x+x數千次,x變得非常大。您正在測量添加兩個非常大的數字所需的時間。

+0

謝謝!我現在看到問題了! – Wang

+0

這似乎是它。將x設置爲0而不是47,並且它們採用相同的時間。 – cobbal

+0

是啊,如果你在它上面加上'x = x + x; x = 1'的行,一切都會消失 –

相關問題