2010-10-27 7 views
3

Я хотел бы знать, сколько времени займет Deferred для выполнения, начиная с момента, когда первый обратный вызов будет запущен до конечного результата.python twisted: получить время выполнения отложенного времени

Любые идеи о том, как это сделать, возможно, неинвазивным образом (что означает отсутствие каких-либо изменений в функции обратного вызова для отслеживания времени выполнения)?

ответ

7

Если вы используете свою программу с помощью «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

1

профилирование немного избыточна для того, что Я бы хотел достичь.

Я закончил с решением, которое не подразумевает тяжелые модификации на существующем коде, но это ни в коей мере «универсальный»:

мой исходный код был что-то вроде:

def myfunc(*args): 
    d = Deferred() 
    d.addCallback(cb1) 
    ... 
    d.addCallback(lambda x: MyObject(x)) 

Я сейчас есть:

def myfunc(*args): 
    init_time = time.time() 
    d = Deferred() 
    d.addCallback(cb1) 
    ... 
    d.addCallback(lambda x: MyObject(x, init_time)) 

class MyObject: 
    def __init__(self, *args): 
     ... 
     self.exec_time = time.time() - init_time 

Он делает только то, что я хочу, но я надеялся на отсроченную структуру подвергнет то отслеживающее само время выполнения, вместо того, чтобы повозиться с моими объектами. Из исходного кода, я могу видеть ничего подобного не имеется: http://twistedmatrix.com/trac/browser/tags/releases/twisted-10.0.0/twisted/internet/defer.py#L137

+0

@ user304965: Я не решался дать такой ответ, в первую очередь из-за того, что вы должны использовать свои обратные вызовы для профилирования. Это возможно, если вы пишете собственный код. Тем не менее для этой цели уродливый код инструмента. Но если вы используете обратные вызовы из другого модуля, вы даже не можете этого сделать. Идея заключается в том, что обратные вызовы будут срабатывать немедленно, но это зависит от многих вещей, происходящих вокруг. – pyfunc

2

Думает, вы должны профилирование приложения, следовать таким образом:

установить этот инструмент http://kcachegrind.sourceforge.net/html/Home.html

огня вашего витого приложение и собрать исходные данные :

twistd --savestats -n --profile = myapp.hotshot MyApp

чем, вы конвертируете «hotshot» в «calltree», запуск:

hotshot2cg myapp.hotshot> myapp.calltree

Теперь мы можем просматривать calltree в инструменте Kcachegrind.

KCacheGrind myapp.calltree

с помощью этого инструмента вы можете просмотреть автодозвон график скрученного цикла событий, времени выполнения вы можете увидеть в процентах. , поэтому не нужно исправлять код, просто запустите этот инструмент и посмотрите

P.S. для проверки памяти: How to use guppy/heapy for tracking down memory usage

+0

Что дает команда hotshot2cg? Я не могу найти упоминания об этом в pip или brew и не упоминать об этом в Интернете .... – Vitali

+0

hotshot2cg похож на конвертер и является частью приложения KCacheGrind, поэтому он должен быть установлен первым. – far

+0

Мне не удалось запустить hotshot2cg, даже после установки kcache grind. Мне не удалось найти алгоритм/программное обеспечение для преобразования hotshot в calltree. Downvote. –

Смежные вопросы