我最近使用timeit模塊來做一個非常簡單的python性能測試。結果真的讓我目瞪口呆:x=x+x
消耗的時間約爲125次的x+x
或y=x+x,
爲什麼?!我真的希望有人會給我一些線索,也許我用錯了嗎?謝謝!python x = x + x比y = x + x ?!慢120倍爲什麼?
請注意y=x+x;x=y
是x=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()
你使用的是什麼版本的Python?我有一種感覺,這是由什麼casevh筆記加上版本問題引起的。我猜你在2.6或更低。 – inspectorG4dget
我還會提到代碼非常「Java-ish」,反Python很直觀......你不需要行延續......只是用','來分隔列表元素並從那裏開始。 ..例如。在'傳','x = 47'中,\''''是不必要的。 –
「@ inspectorG4dget:你使用的是什麼版本的Python?」 sys.version = 2.7.2+(默認,2011年10月4日,20:06:09) [GCC 4.6.1] 謝謝大家,尤其是@casevh!我通過添加「x = 47;」來解決問題在每個測試中。這絕對是timeit模塊的使用問題,因爲我期望:D – Wang