2012-06-30 70 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'的行,一切都会消失 –

相关问题