2011-03-30 6 views
3

누군가가 왜 이런 일이 일어 났는지 설명 할 수 있습니까? 파이썬 시간이 작동하지 않습니까?

[email protected] ~ $ time python /usr/lib64/python2.7/timeit.py -n 1 \ 
    -- 'x = 10**1000' 
1 loops, best of 3: 0.954 usec per loop 

real 0m0.055s 
user 0m0.050s 
sys  0m0.000s 

[email protected] ~ $ time python /usr/lib64/python2.7/timeit.py -n 1 \ 
    -- 'x = 10**100000' 
1 loops, best of 3: 0.954 usec per loop 

real 0m0.067s 
user 0m0.040s 
sys  0m0.020s 

[email protected] ~ $ time python /usr/lib64/python2.7/timeit.py -n 1 \ 
    -- 'x = 10**10000000' 
1 loops, best of 3: 0.954 usec per loop 

real 0m20.802s 
user 0m20.540s 
sys  0m0.170s 

나는 timeit에서 동일한 결과를 얻을 수 있지만, time10**10000000을 평가하는 20 초 이상 걸리는 것을 알려줍니다.

>>> t = time.time() 
>>> print timeit.timeit('x = 10**10000000;', number=1) 
5.00679016113e-06 
>>> print time.time() - t 
20.6168580055 

왜 내 작업 timeit하지, 또는 내가 무슨 일을하고있는 중이 야 : 나는 인터프리터에서 timeit를 호출하면 같은 일이 일어날까요?

추가 정보 :

>>> print sys.version 
2.7.1+ (2.7:4f07cacb2c3b+, Mar 28 2011, 23:11:59) 
[GCC 4.4.5] 

>>> print sys.version_info 
>>> sys.version_info(major=2, minor=7, micro=2, releaselevel='alpha', serial=0) 

UPDATE : 여기

다른 매우 흥미로운 관찰의 :이 기능을 정의한 후 Enter 키를 누르면

>>> def run(): 
...  t = time.time() 
...  x = 10**10000000 
...  print time.time() - t 

, 그것은 절반 분 소요가 내가 프롬프트로 돌아갈 때까지. 그런 다음 :

>>> run() 
2.14576721191e-06 

왜 그런가요? 함수 본문이 미리 컴파일되거나 어떻게 든 최적화되어 있습니까?

답변

5

제 생각에 문제는 timeit에게 문제를 말하고있는 것입니다. 무슨 일이 일어나고 있는지는 테스트 표현식이 컴파일 된 다음 한 번 평가되고 나서 각 timeit 루프로 (재평가가 아닌) 보였다는 것입니다. 따라서 현재 측정하는 것은 계산이 아닌 과제를 수행하는 데 걸리는 시간입니다.

각 시간을 일이 계산을 강제해야합니다 :

timeit.timeit('x = 10; y = 100; z = x ** y') 

편집 : 대답을하여 나중에 질문에 대한 함수 본문이 최적화되고있다. 컴파일러는 10*100000을 확인하고 변경되지 않을 것임을 인식하여 런타임보다는 컴파일 타임에 계산합니다.

+0

맞을 때마다 계산을 수행하면 시간이 오래 걸립니다. 파이썬이 나에게 표현을 미리 계산할지는 몰랐다. –

+0

@Attila - 지금까지 내가 한 적이 없습니다. –

4

비교 : BINARY_POWER 만 두 번째 경우에 런타임에 실행

>>> import dis 
>>> def run(): 
...  return 10**100 
... 
>>> dis.dis(run) 
    3   0 LOAD_CONST    3 (100000000000000000000000000000000000 
00000000000000000000000000000000000000000000000000000000000000000L) 
       3 RETURN_VALUE   

그리고

>>> def runvar(): 
...  x = 10 
...  return x**100 
... 
>>> dis.dis(runvar) 
    3   0 LOAD_CONST    1 (10) 
       3 STORE_FAST    0 (x) 

    4   6 LOAD_FAST    0 (x) 
       9 LOAD_CONST    2 (100) 
      12 BINARY_POWER   
      13 RETURN_VALUE   

공지있다. 따라서 timeit은 정상적으로 동작합니다.

관련 문제