2013-02-16 4 views
1

다른 프로세스의 시간, 데이터 I/O, 정확성 등을 벤치마킹하기위한 시스템으로 Python을 사용하려고합니다. 내가 정말로 관심을 갖고있는 것은 시간의 정확성입니다. 예를 들어Python으로 벤치마킹

start = time() 
subprocess.call('md5sum', somelist) 
end = time() 
print("%d s", end-start) 

하위 프로세스가 호출되는 함수에 상당한 오버 헤드를 추가합니까? 내 최고의 옵션을 표시 음 몇 가지 간단한 테스트 후

편집

그러나 나는 표준 에러에 포함 된 표준 출력 /에 의해 언급 한 subprocess을 사용하는 것입니다 그것을 실행에 대한 0.002338 s 여분의 시간을 추가 전화 통신합니다.

+2

Sidenote :''/ usr/bin/time -v''에 대해 알고 있습니까? –

+0

@JonasWielicki 그렇습니다. 그러나 테스트하고 싶은 시스템에서이 기능을 사용할 수있는 것은 아닙니다. – Blackninja543

+0

당신은 거기에 파이썬이 있다고 이상합니다. '''' –

답변

0

사용 timeit

import timeit 
timeit.timeit('yourfunction') 

당신이 리눅스에 있다면, 다음과 같이 time 명령을 사용할 수 있습니다

업데이트 : 당신의 타이머 스크립트를하지 않습니다

import subprocess 
result = subprocess.Popen(['time', 'md5sum', somelist], shell = False, stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate() 
print result 
+1

그 밖의 오버 헤드를 추가하기 때문에 서브 프로세스를 호출하려는 경우 특히 유용하지 않습니다. –

+1

@JonasWielicki하지만 'start' 및'end'보다 좋습니다. – ATOzTOA

+0

@ATOzTOA'time' 명령을 사용하지 않은 이유는 항상 같은 형식으로 존재하지 않을 수도 있기 때문입니다. 파이썬을 사용하게 된 이유는 내가 작업 할 환경에 2.6이 항상 존재한다는 것입니다. – Blackninja543

0

경우 stdout/stderr에 대해 신경 써서 출력을 파일이나/dev/null로 파이프하면됩니다. 이렇게하면 증기를 읽고 파이썬 문자열로 변환하는 오버 헤드를 피할 수 있습니다.

start = time() 
subprocess.call(['md5sum'] + some_list, stdout=open('/dev/null', 'w'), 
    stderr=subprocess.STDOUT) 
delta = time.time() - start 

stdout과 stderr을 별도의 스트림으로 읽을 필요가없는 경우 communications()를 피하십시오. 오버 헤드에 추가되는 stderr을 읽는 두 번째 스레드가 생성됩니다.