2014-07-21 1 views
-1

숫자의 계승을 계산하는 매우 간단한 프로그램을 작성하고 있습니다. 여기Python을 사용한 다른 실행 시간

이있다 : (나를 위해)

import time 
def factorial1(n): 
    fattoriale = 1 
    while (n > 0): 
     fattoriale = fattoriale * n 
     n = n - 1 
    return fattoriale 

start_time = time.clock() 
factorial1(v) 
print float(time.clock() - start_time), "seconds" 

이상한 점은 (A 값) 실행 시간의 기간의 결과입니다

1 ° 실행 : 0.000301 초

2 ° 실행 : 0.000430 초

3 ° 실행 : 0.000278 초

왜 너는 그렇게 변하기 쉬운 것 같니? 플로트 타입 근사치와 관련이 있습니까?

감사합니다. Gianluca

+0

실행중인 OS는 무엇입니까? –

답변

1

유닉스 기반 시스템에서 time.clock은 벽시계가 아닌 CPU 시간을 반환합니다.

프로그램이 결정적이며 (심지어 인쇄가) 이상적인 시스템에서 항상 동일한 시간 내에 실행되어야합니다. 나는 당신의 테스트에서 당신의 프로그램이 중단되었고 인터럽트 핸들러가 실행되었거나 스케줄러가 프로세스를 멈추고 다른 프로세스에 CPU를 제공했다고 믿는다. 프로세스가 다시 실행될 수있게되면 CPU 캐시는 다른 프로세스에 의해 채워질 수 있으므로 프로세서가 메모리에서 캐시로 코드를 다시로드해야합니다. 테스트에는 약간의 시간이 소요됩니다.

프로그램의 속도를 잘 양자화하려면 factorial1을 한 번만 수천 번 (또는 더 큰 입력 값)으로 호출하지 않는 것이 좋습니다. 프로그램이 여러 초 동안 실행될 때 스케줄링 효과는 밀리 초 미만으로 테스트 한 테스트보다 영향이 적습니다.

1

아마도 리소스 공유와 관련이 있습니다. 프로그램이 별도의 프로세스로 실행되는 경우 CPU 및 RAM과 같은 리소스를 사용하는 동시에 컴퓨터에서 실행중인 다른 프로세스와 경쟁해야 할 수 있습니다. 이러한 리소스는 다른 프로세스에서도 사용되므로 병행 조건에 따라 '획득'하는 것이 특히 우선 순위가 높은 프로세스가 병렬로 실행되는 경우와 인터 럽트와 같은 다른 프로세스가 더 높은 우선 순위를 가질 수있는 경우에는 가변 시간이 소요됩니다.

내가 아는 바로는 근사 프로세스가 결정적 알고리즘을 실행함에 따라 가변적 인 시간을 가져서는 안됩니다. 그러나 근사 프로세스가 자원에 대해 다시 경쟁해야 할 수도 있습니다.

+0

Unix 기반 시스템에서 time.clock은 월 시간이 아닌 CPU 시간을 반환합니다. –