2010-10-27 31 views
3

我想知道从第一个回调被触发到最终结果时,Deferred需要执行多长时间。python twisted:检索延迟的执行时间

关于如何做到这一点的任何想法,可能是以非侵入的方式(意味着为了追踪执行时间而不需要修改任何回调函数)?

回答

7

如果您在“twistd”帮助下运行程序,那么它有一个选项“--profile”,它可以帮助您分析扭曲的代码。

twistd "other options" --profile=statsfile --profiler=cProfile --savestats 

并查看统计:

​​3210

回调执行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 2010-10-28 20:19:27

2

猜你应该配置您的应用程序,遵循这样:

安装此工具http://kcachegrind.sourceforge.net/html/Home.html

消防您的扭曲的应用程序,并收集原始数据:

twistd来--savestats -n --profile = myapp.hotshot MYAPP

比你将'hotshot'转换为'calltree',运行:

hotshot2cg myapp.hotshot> myapp。calltree

现在我们可以在Kcachegrind工具中查看calltree。

kcachegrind myapp.calltree

使用此工具可以查看扭曲事件循环调用图, 执行时间,你可以以百分比看到。 所以不需要修补代码,只需运行此工具,看看

P.S.检查内存: How to use guppy/heapy for tracking down memory usage

+0

什么提供了hotshot2cg命令?我找不到任何提及它在点或酿造和网上不提.... – Vitali 2015-04-09 22:22:34

+0

hotshot2cg就像一个转换器,是KCacheGrind应用程序的一部分,所以它应该先安装。 – far 2015-04-22 09:28:08

+0

即使在安装kcache grind之后,我仍然无法运行hotshot2cg。我无法找到任何算法/软件来将热点转换为calltree。 Downvote。 – 2017-03-12 03:45:17