2010-06-28 2 views
2

안녕하세요 전문가 Pythonists, 내 프로그램에 대한 자세한 타이밍 정보를 가지고 cProfile을 사용하기 시작했습니다. 그러나 상당한 오버 헤드가 있다는 것은 나에게 상당히 혼란 스럽다. cProfile이 7 초를보고하는 이유는 무엇입니까? 아래의 코드에서 시간 모듈은 2 초만보고 했습니까?파이썬 cProfile에서 심각한 오버 헤드가 발생 했습니까?

# a simple function 

def f(a, b): 
c = a+b 

# a simple loop 
def loop(): 
for i in xrange(10000000): 
    f(1,2) 

# timing using time module 
# 2 seconds on my computer 
from time import time 
x = time() 
loop() 
y = time() 
print 'Time taken %.3f s.' % (y-x) 

# timing using cProfile 
# 7 seconds on my computer 
import cProfile 
cProfile.runctx('loop()', globals(), locals()) 

답변

3

더 많은 작업을 수행하고 있기 때문에? time은 전체 작업을 단지 번 수행하는 반면 cProfile은 계측 작업을 실행하므로 자세한 분석을 할 수 있습니다. 분명히 프로 파일링은 프로덕션에서 사용하기위한 것이 아니므로 2.5x 오버 헤드는 지불 할 작은 가격처럼 보입니다.

+0

또한이 함수는 매우 평범하기 때문에 프로파일 러가 상대적으로 총 실행 시간을 많이 차지하는 것으로 보입니다 자귀. –

+0

답장을 보내 주셔서 감사합니다. loop()의 반복 횟수를 10 백만에서 100 백만으로 늘리면 타이밍이 선형으로 확장됩니다! 시간 모듈은 20 초가 걸리고 cProfile은 70 초가 걸렸습니다. cProfile을 실행하는 데 시간이 오래 걸리지 만보고 된 시간 (코드에서 실제로 소요 된 시간)은 오버 헤드를 제외해야합니다. cProfile을 보정하는 방법이 있습니까 (코드에서 실제로 소요 된 시간에만 관심이 있으므로)? – user378289

+1

@xqx : 내가 아는 것은 아닙니다. 프로파일 링은 프로그램의 다른 부분의 _ 관련성에 대한 아이디어를 제공하지만 프로덕션 성능보고에 적합하지 않습니다. –

1

함수 f이 매우 빨리 반환됩니다. cProfile을 사용하면 f을 한 번 호출 한 시간이 너무 짧아 측정 시간의 오류와 비교할 수 없기 때문에 정확하지 않습니다. 시간 차이를 측정하는 데 사용되는 시계는 0.001 초까지만 정확할 수 있습니다. 따라서 각 측정의 오류는 측정하려는 시간보다 훨씬 더 커질 수 있습니다. 이것을 1e7 번하고 가짜 결과를 얻었습니다. (이 더 많은 논의 http://docs.python.org/library/profile.html#limitations를 참조하십시오.) 코드를 변경 한 경우 당신은 루프 같은 수의 일을

Time taken 0.732 s. 
     1003 function calls in 0.725 CPU seconds 

    Ordered by: standard name 

    ncalls tottime percall cumtime percall filename:lineno(function) 
     1 0.000 0.000 0.725 0.725 <string>:1(<module>) 
    1000 0.723 0.001 0.723 0.001 test.py:4(f) 
     1 0.001 0.001 0.725 0.725 test.py:9(loop) 
     1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 

얻을 수 있지만, 각

def f(a, b): 
for i in xrange(int(1e4)):  
    c = a+b 

# a simple loop 
def loop(): 
for i in xrange(int(1e3)): 
    f(1,2) 

사용하는 것을

공지 사항 f으로 전화하는 데 더 오래 걸립니다. 이렇게하면 측정 당 오류가 줄어 듭니다. (f에 대한 각각의 호출에 기인 한 시간은 현재 측정 된 총 시간이 아니라는 오류를 포함하고 있습니다.)

+0

안녕하세요. 귀하의 예에서 프로파일 러를 사용하거나 사용하지 않은 시간은 매우 가깝습니다 (예 : 0.732s 및 0.725s). 당신이 언급 한 가능한 도입 된 오류 외에도, 필자는 예제에서 함수 f가 더 많은 시간 (예제에서 1e3과 반대되는 1e7)으로 호출되므로 프로파일 링 비용이 더 많이 든다고 생각합니다. – user378289

관련 문제