Серьезные издержки в Python cProfile?

Привет эксперт Pythonists там, я начинаю использовать cProfile, чтобы иметь более подробную информацию синхронизации о моей программе. Однако это является довольно тревожащим для меня, что существуют значительные издержки. Какая-либо идея, почему cProfile сообщил о 7 секундах, в то время как модуль времени только сообщил о 2 секундах в коде ниже?

# 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())
5
задан user378289 28 June 2010 в 17:53
поделиться

2 ответа

Функция f возвращается очень быстро. Когда вы используете cProfile, время, приписываемое одному вызову f, не является точным, поскольку время настолько мало, что сравнимо с погрешностью измерения времени. Часы, используемые для измерения разницы во времени, могут быть точны только до 0,001 секунды. Таким образом, ошибка в каждом измерении может быть на порядки больше, чем время, которое вы пытаетесь измерить. Сделайте это 1e7 раз, и вы получите фальшивые результаты. (См. http://docs.python.org/library/profile.html#limitations для более подробного обсуждения этого вопроса).

Заметьте, что если вы измените код, чтобы использовать

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)

вы получите

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}

Вы делаете то же количество циклов, но каждый вызов f занимает больше времени. Это уменьшает ошибку на измерение. (Время, отнесенное к каждому вызову f, содержит ошибку, которая теперь не так велика в общем измеренном времени)

.
1
ответ дан 14 December 2019 в 13:26
поделиться

Потому что он делает намного больше? time просто умножает всю операцию, в то время как cProfile запускает ее под инструментарием, чтобы можно было получить подробную разбивку. Очевидно, что профилирование не предназначено для использования в производственной среде, поэтому накладные расходы в 2,5 раза кажутся небольшой платой.

5
ответ дан 14 December 2019 в 13:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: