如何使用callable作为设置计时。计时?

2024-10-01 09:23:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我想计时一些代码,这取决于一些设置。设置代码看起来有点像:

>>> 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一个实例计时。计时. 在

马特


Tags: 实例字符串代码importself空间rangeunittest
2条回答

在2.6中,您可以根据the docs来“只做它”:

Changed in version 2.6: The stmt and setup parameters can now also take objects that are callable without arguments. This will embed calls to them in a timer function that will then be executed by timeit(). Note that the timing overhead is a little larger in this case because of the extra function calls.

你还在使用旧版本的Python吗?在这种情况下,我建议使用Python2.6的timer.py源代码,并将它们“后传”到您一直使用的版本,如果该版本是2.5,应该不会很困难(当然,您需要返回的时间越长,就越难)。我通常不建议在“生产”代码中使用这种方法,但是对于支持测试、调试、性能度量等的代码来说,这是非常好的。在

我问了这个问题的一个变体,也得到了一个没有解决我问题的答案。我相信我们都没能用Python来表达这个问题。在

我不知道这是否是一个黑客,解决办法,或它应该如何做,但它确实有效:

>>> import timeit
>>> b = range(1, 1001)
>>> t = timeit.Timer('sorted(b)', setup='from __main__ import b')
>>> t.repeat(3, 100)
[0.0024309158325195312, 0.0024671554565429688, 0.0024020671844482422]
# was it really running 'sorted(b)'? let's compare'
>>> t = timeit.Timer('pass', setup='from __main__ import b')
>>> t.repeat(3, 100) 
[3.0994415283203125e-06, 2.1457672119140625e-06, 1.9073486328125e-06] 
# teeny times for 'pass', 'sorted(b)' took more time

我读过了timeit.py,它的工作方式是构造一个语句,然后使用与主命名空间(似乎)没有连接的新命名空间对其调用eval()。请注意,由于sorted是一个内置的,因此timeit.repeat()中的求值表达式可以访问该名称;如果它是您的def,则必须from __main__ import b, myfunc。在

我希望有比这更合适的方法来达到目的。在

相关问题 更多 >