我想计时一些代码,这取决于一些设置。设置代码看起来有点像:
>>> b = range(1, 1001)
我想计时的代码大致如下:
^{pr2}$只是我的代码使用了与sorted不同的函数。但现在这并不重要。在
不管怎样,只要我把字符串传给timeit,我就知道如何计时:
>>> import timeit
>>> t = timeit.Timer("sorted(b)", "b = range(1, 1001)")
>>> min(t.repeat(3, 100))
如何使用setup callable并将其放入stmt callable可以访问的命名空间中?
换句话说,我如何做与上面代码相同的事情,但是使用可调用的,而不是包含可调用的字符串?在
顺便说一句,这里更大的目标是重用单元测试中的代码来衡量性能:
import unittest
class TestSorting(unittest.TestCase):
def setUp(self):
self.b = range(1, 1001)
def test_sorted(self):
sorted(self.b)
我希望做一点工作。timeit安装程序需要创建TestSorting的一个实例,而stmt代码将不得不使用该特定实例。在
一旦我理解了如何让timeit设置将内容放入与timeit stmt相同的命名空间中,我将研究如何进行转换unittest.TestCase一个实例计时。计时. 在
马特
在2.6中,您可以根据the docs来“只做它”:
你还在使用旧版本的Python吗?在这种情况下,我建议使用Python2.6的
timer.py
源代码,并将它们“后传”到您一直使用的版本,如果该版本是2.5,应该不会很困难(当然,您需要返回的时间越长,就越难)。我通常不建议在“生产”代码中使用这种方法,但是对于支持测试、调试、性能度量等的代码来说,这是非常好的。在我问了这个问题的一个变体,也得到了一个没有解决我问题的答案。我相信我们都没能用Python来表达这个问题。在
我不知道这是否是一个黑客,解决办法,或它应该如何做,但它确实有效:
我读过了timeit.py,它的工作方式是构造一个语句,然后使用与主命名空间(似乎)没有连接的新命名空间对其调用eval()。请注意,由于
sorted
是一个内置的,因此timeit.repeat()
中的求值表达式可以访问该名称;如果它是您的def
,则必须from __main__ import b, myfunc
。在我希望有比这更合适的方法来达到目的。在
相关问题 更多 >
编程相关推荐