我最近使用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