2010-08-08 6 views
2

는 그래서 2.6과 3.1 사이의 파이썬의 성능을 비교하고 싶었다, 그래서 나는 몇 가지 기본적인 긴 작업 수행이 간단한 프로그램 test.py 썼다 출시 이후부터,Python에서 경과 시간을 계산하는 동안 혼란이 있습니까?

from time import time 
start = time() 
q = 2 ** 1000000000 
q += 3 << 1000000000 
print(q.__sizeof__(), time() - start) 

내가 못해서 내가 기대 무엇을 명령 time python2.6 test.pytime python3.1 test.py 및 각각의 출력은 다음이었다

(133333364, 0.37349200248718262) 

real 0m35.586s 
user 0m28.130s 
sys 0m2.110s 

와,

133333360 0.312520027161 

real 0m26.413s 
user 0m17.330s 
sys 0m2.190s 

time 명령의 출력과 프로그램 내부에서 수행 된 결과를 비교할 때 두 버전의 결과가 비슷하다고 가정했습니다. 이것에 대한 설명은 무엇입니까?

답변

2

훗이 문제를 iteresting, 그것을 알아낼 걸 렸어요!!

from time import time 
start = time() 
q = 2 ** 1000000000 # number literal 
q += 3 << 1000000000 # still a literal 
print(q.__sizeof__(), time() - start) 

파이썬의 컴파일러는() Q를 계산한다. 스크립트가 실행되면 인터프리터가 시간을 들여 이미 계산 된 값을로드하고 시간이 다시 걸립니다. 이제 놀랍지도 않지만 두 번은 거의 동일합니다.

은 전체 실행 (컴파일 + 실행) 시간을 측정합니다.

+0

사실, 변수'x = 1000000000'을 사용하고 다른 2 개의 명령어에서 그 수를 x로 바꾸면 결과가 거의 일치합니다. 리터럴의 계산은 코드를 실행하기 전에 수행됩니다. 고맙습니다! – banx

3

sys.path에 다른 디렉토리 (및 zip 파일) 세트, 초기화시 자동으로로드/실행 된 코드, 플랫폼에서 실행중인 다른 프로세스 등 많은 설명이있을 수 있습니다. 코드가 전혀 분리되거나 반복 가능하지 않으며, 그러므로 그 결과는 아주 작은 가치입니다. 많은 것을 측정하려면 python -mtimeit을 사용하십시오. 많이입니다.

편집 : 일부 번호는 ... :

$ py26 -mtimeit 'q=2**1000000000; q+=3<<1000000000' 
10 loops, best of 3: 466 msec per loop 
$ py31 -mtimeit 'q=2**1000000000; q+=3<<1000000000' 
10 loops, best of 3: 444 msec per loop 

이 정확하게 += 시간 (약간 더/더 반복적으로, 3.1 최적화)를 측정한다. 또는 으로 올림하여 번으로 올리면, 리터럴을 사용할 수 없습니다. (리터럴 표현식은 컴파일 타임에 계산되기 때문에 런타임에는 계산되지 않습니다. 코드에서 모듈의 함수에, 이 아니 최상위 코드 또는 메인 스크립트에서 ... 그래서 컴파일러는 심각한 최적화의 부족에도 불구하고 쉽게 가능한 일을 많이 할 수 있습니다 ;-). 예 :

$ py31 -mtimeit -s't=2' 'q=t**1000000' 
10 loops, best of 3: 19.4 msec per loop 
$ py31 -mtimeit -s't=3' 'q=t<<1000000' 
10000 loops, best of 3: 150 usec per loop 

(큰 RHS 피연산자를 사용하는 데 너무 오래 걸리므로 참을성이 없어졌습니다. 조종사를 믹싱하는 것은 당연히 측정면에서 슬픈 재앙이 될 것입니다. 상대적으로 빠 른 것들은 본질적으로 믹스에서 사라질 것입니다. -) 다행히도, 그러한 믹싱에 대한 좋은 이유는 없습니다 - timeit, 결국은 마이크로 용입니다. 벤치마킹 -)

+0

여전히이 세트를로드하는 데는 35 초가 걸리지 않습니다. 다른 프로그램을 실행하는 동안 오래 걸리지는 않을 것입니다. 나는 파이썬이'start' 변수를 계산하기 전에'q'에서 값을 계산 한 백그라운드에서 몇 가지 최적화 프로 시저를 수행 할 가능성을 생각하고있었습니다. 파이썬 순차 순서 흐름을 폐기하여 이러한 최적화를 수행합니까? – banx

+0

@banx, 아니요, 파이썬 옵티마이 저는 매우 간단하고, 예측 가능하며, 빠르며, 버그가 없으며 따라서 단순함을 의도적으로 고려하여 의도하지 않은 최적화를 수행하지 않습니다. 아직도, 당신이 사용하고있는 __literals__은 실제로 컴파일 시간에 계산됩니다. (그것은 최적화조차도 아니며 컴파일 자체의 생각할 부분입니다). –

+0

@Alex_Martelli : 오랜 시간의 설명에 감사 드리며, THC4k는 리터럴을 사용하는 실수를 지적했습니다. 당신의 설명은'--mtimeit' 옵션에 대해 배워서 파이썬의 두 버전을 비교하는 원래의 작업에 도움이됩니다. – banx

관련 문제