Привет эксперт 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())
Функция 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
, содержит ошибку, которая теперь не так велика в общем измеренном времени)
Потому что он делает намного больше? time
просто умножает всю операцию, в то время как cProfile
запускает ее под инструментарием, чтобы можно было получить подробную разбивку. Очевидно, что профилирование не предназначено для использования в производственной среде, поэтому накладные расходы в 2,5 раза кажутся небольшой платой.