Если вы запускаете свою программу с помощью «twistd», то у нее есть опция «--profile», которая может помочь вам с профилированием витого кода.
twistd "other options" --profile=statsfile --profiler=cProfile --savestats
И для просмотра статистики:
import pstats
stats = pstats.Stats('statsfile')
stats.sort_stats('time').print_stats()
Обратные вызовы выполняются сразу после срабатывания отложенных.Но немедленно означает, что каждый обратный вызов в отложенной цепочке должен быть выполнен, и у них будет свое время выполнения.Также различные части кода будут иметь свой собственный интервал времени для выполнения, включая цикл реактора.
Так сказать слово - сразу значит сказать как можно скорее.
Рассмотрим следующий плохой пример:
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