Если вы используете свою программу с помощью «twistd», тогда у нее есть опция «--profile», которая может помочь вам профилировать витой код.
twistd "other options" --profile=statsfile --profiler=cProfile --savestats
и просмотра статистики:
import pstats
stats = pstats.Stats('statsfile')
stats.sort_stats('time').print_stats()
Callbacks выполняются сразу же после того, как deferreds увольняют. Но сразу же означает, что каждый обратный вызов в отложенной цепочке должен быть выполнен, и у них будет свое собственное время выполнения. Также различные кусочки кода будут иметь свой собственный отрезок времени для выполнения, включая петлю реактора.
Так сказать, слово - немедленно сказать как можно скорее.
Рассмотрим следующий плохой пример:
from twisted.internet import reactor, defer
import time
def timeit(func):
def wrapper(*arg):
t1 = time.time()
res = func(*arg)
t2 = time.time()
print '%s took %0.3f ms' % (func.func_name, (t2-t1)*1000.0)
return res
return wrapper
d = defer.Deferred()
@timeit
def callfunc1(result):
print 'XXXXX'
@timeit
def callfunc2(result):
print 'YYYYY'
d.addCallback(callfunc1)
d.addCallback(callfunc2)
t1 = time.time()
d.callback(True)
t2 = time.time()
print '%0.3f ms' % ((t2-t1)*1000.0)
Выход:
XXXXX
callfunc1 took 0.039 ms
YYYYY
callfunc2 took 0.005 ms
0.108 ms
Теперь, если мы подправить код выше, чтобы включить реактор и callLater
@ user304965: Я не решался дать такой ответ, в первую очередь из-за того, что вы должны использовать свои обратные вызовы для профилирования. Это возможно, если вы пишете собственный код. Тем не менее для этой цели уродливый код инструмента. Но если вы используете обратные вызовы из другого модуля, вы даже не можете этого сделать. Идея заключается в том, что обратные вызовы будут срабатывать немедленно, но это зависит от многих вещей, происходящих вокруг. – pyfunc