如何将当前对象引用(self)传递给timeit模块的Timer类?
我想把当前对象的引用,也就是self,传递给timeit模块的Timer类,但我不知道该怎么做。我在timeit的文档里找过,但没找到相关信息。我把我的代码附在了这个问题下面。
from timeit import Timer
import time
import math
class PollingDemo(Thread):
def __init__(self):
pass
def looper(self):
while 1:
try:
T = Timer("self.my_func()")
#T = Timer("polling.my_func()", "from __main__ import polling")
time_elapsed = T.timeit(1)
if math.ceil(time_elapsed) == 1:
print "Process is sleeped for 1 sec"
time.sleep(1)
except KeyboardInterrupt:
return
def my_func(self):
pass
if __name__ == '__main__':
polling = PollingDemo()
polling.looper()
在这个例子中,我试图通过Timer类的timeit()方法调用PollingDemo类的my_func()方法,但我遇到了“NameError: global name 'self' is not defined”的错误。如果我们通过main来访问那个对象就没问题(下一行注释的代码运行得很好)。有人能告诉我为什么会这样吗?
谢谢大家。
2 个回答
2
如果你需要传递一些参数,可以直接使用 partial 这个工具,它来自 functools 这个模块。
import functools
import timeit
def printme(msg):
print msg
print "Timing: %f" % timeit.timeit(functools.partial(printme, "Hello world"))
5
不要使用字符串,Timer 也可以接受可调用的对象,所以直接传递一个绑定到 self 的引用,也就是:
T = Timer(self.my_func)
(只传递引用,不要调用它)。
如果你需要更复杂的设置,还是把它放在一个函数或方法里,然后传递那个方法。