2012-06-30 4 views
2

최근에 파이썬의 매우 간단한 성능 테스트를 위해 timeit 모듈을 사용했습니다. 그 결과 실제로 나를 기절 시켰습니다. x=x+x에 의해 소모 된 시간은 약 입니다. 125 시간x+x 또는 y=x+x,입니다. 나는 누군가가 나에게 이것에 대한 단서를 줄 것을 정말로 희망한다. 아마도 나는 timeit을 잘못 사용 했을까? 감사! 파이썬 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

테스트 케이스 = "X = 47 * 2", 시간 경과 : 0.002423secs

테스트 케이스 = "X + X", 시간 경과 : 0.003922secs

테스트 케이스 = "X * 2" 시간 경과 : 0.005307secs

테스트 케이스 = "X = X + X", 시간 경과 : 0.497974secs

테스트 케이스 = "X = X * 2", 시간 경과 : 0.727506secs

,691,363,210

테스트 케이스 = "X = X + 47", 시간 경과 : 0.005770secs

테스트 케이스 = "X = 47 + X", 시간 경과 : 0.004442secs

테스트 케이스 = "X + = X" 시간 경과 : 0.498920secs

테스트 케이스 = "Y = X + X", 시간 경과 : 0.006327secs

= "Y = X * 2", 시간 경과 0.004102secs

테스트 케이스

테스트 케이스 = "Y = X + X

X = Y", 시간 경과 : 0.499644secs

테스트 케이스 = "X + X

Y = X", 시간 경과 : 0.004948secs

테스트 케이스는 = "X + X

X = Y", 시간 경과 : 0.005126secs

테스트 케이스 123,414,= "Y = 10

X = Y", 시간 경과 = "패스"0.003351secs

테스트 케이스, 시간 경과 : 0.001487secs

내가 사용하는 코드 : 당신은 시간의 x=x+x 수천을 계산할 때, x가 매우 큰됩니다

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

어떤 버전의 파이썬을 사용하고 있습니까? 나는 이것이 casevh 노트가 버전 문제와 결합 된 것에 기인한다고 느낀다. 나는 당신이 2.6 이하인 것 같아. – inspectorG4dget

+0

나는 코드가 매우 "Java-ish"이고 카운터 파이썬이 직관적이라고 언급 할 것이다 ... 당신은 줄 연속을 필요로하지 않는다 ... ','를 사용하여리스트 요소를 분리하고 거기에서부터 나아 간다. .. 예. ''pass ','x = 47 ', \''\ '는 불필요합니다. –

+0

"@ inspectorG4dget : 어떤 버전의 파이썬을 사용하고 있습니까?" sys.version = 2.7.2+ (default, Oct 4 2011, 20:06:09) [GCC 4.6.1] 감사합니다. 특히 @casevh! 문제를 해결하려면 "x = 47;"을 추가하십시오. 각 테스트마다. 확실히 내가 예상했던대로 timeit 모듈의 사용 문제입니다 : D – Wang

답변

11

. 두 개의 매우 큰 숫자를 추가하는 데 걸리는 시간을 측정하고 있습니다.

+0

고마워요! 나는 지금 문제를 본다! – Wang

+0

이것이 그럴 것 같습니다. 초기에 47 대신 x를 0으로 설정하면 같은 시간이 걸린다. – cobbal

+0

예,'x = x + x; x = 1'이있는 행을 추가하면 모든 것이 전부 사라집니다. –