我正在尝试将当前对象引用(即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:全局名称'self'未定义”错误。如果我们尝试通过 main 访问该对象,则它可以正常工作(下一个注释行可以正常工作)。有人可以为什么会这样做。
提前谢谢。
答案 0 :(得分:5)
不要使用字符串,Timer也接受callables,所以直接传递绑定到self的引用,即
T = Timer(self.my_func)
(只是参考,不要叫它)。
如果您需要更复杂的设置,请再次将其包装在函数或方法中并传递该方法。
答案 1 :(得分:2)
如果您需要传递参数,只需使用functools中的 partial :
import functools
import timeit
def printme(msg):
print msg
print "Timing: %f" % timeit.timeit(functools.partial(printme, "Hello world"))