2017-10-24 4 views
-1

나는 다음 파이썬 코드를 실행파이썬에서 시간이 경과하지 않는 이유는 무엇입니까?

>>> time(),5==25/5,time() 
(1508830844.2450676, True, 1508830844.2450676) 
>>> 

시간이 그러나 명시 적으로 잠

>>> time(),sleep(1),time() 
(1508830151.232, None, 1508830152.246) 
>>> 

또는 사용하여 더 이상 작업

>>> time(),[xi for xi in range(1000000) if xi == 100000],time() 
(1508830458.736, [100000], 1508830458.892) 
>>> 

동작합니다 등을 사용하여, 경과하지 않는 것 같다 예상 시간은 경과되었습니다.

현상이란 무엇입니까? 내가 두 시간() 스탬프의 차이에 대한 긍정적 인 결과를 기대해야 할 때? (파이썬 2.7과 3.5로 테스트 됨)

+0

"시간이 항상 부동 소수점 숫자로 반환 되더라도 모든 시스템이 1 초보다 우수한 정밀도로 시간을 제공하지는 않습니다."- 공식에서 시간에 관한 문서화. 따라서 이것은 단지 시스템 문제 일 수 있습니다. – ShreyasG

+0

'timeit' 모듈을 사용해보십시오. –

답변

2

우선, 모든 식을 같은 줄에 올리며 상수를 접었습니다.

>>> import dis 
>>> dis.dis(compile('time(),5==25/5,time()', '', 'single')) 
    1   0 LOAD_NAME    0 (time) 
       2 CALL_FUNCTION   0 
       4 LOAD_CONST    0 (5) 
       6 LOAD_CONST    3 (5.0) 
       8 COMPARE_OP    2 (==) 
      10 LOAD_NAME    0 (time) 
      12 CALL_FUNCTION   0 
      14 BUILD_TUPLE    3 
      16 PRINT_EXPR 
      18 LOAD_CONST    2 (None) 
      20 RETURN_VALUE 

LOAD_CONST 통화를하고 COMPARE_OP은 모든 거의 모든 시간을하지 : 분할은 time() 호출 사이에 계산되지 않습니다.

다음으로, time() 클록은 아마도 그 3 개의 opcode가 inbetween take 짧은 시간을 포착하는데 필요한 해상도를 가지고 있지 않을 것입니다. time.time() documentation에서 :

시간은 항상 부동 소수점 숫자로 반환되지만 일부 시스템에서는 시간이 1 초보다 우수한 것은 아닙니다.

선택 a higher-resolution clock. 당신에게 다음, 당신이 말하는, 자신의 성능을 비교하기 위해 파이썬 코드의 조각에 시간 시험을 실행하고 싶었다면

>>> from timeit import default_timer 
>>> default_timer(), 5==25/5, default_timer() 
(352821.948302353, True, 352821.948304896) 

: 또는 당신은 당신의 플랫폼에 가장 높은 해상도를 타이머로 설정해야 timeit.default_timer() callable을 사용할 수 있습니다 그래도 timeit module을 사용해야합니다.