【问题标题】:Python: process average timing, first one/two are much slowerPython:处理平均时间,前一个/两个要慢得多
【发布时间】:2012-11-07 09:59:46
【问题描述】:

我正在编写一些使用 Python 进行排序算法比较的程序。我想测量平均排序时间。第一次测量有问题。

这个:

for i in xrange(self.repeats):
    # random list generator
    data_orig = [random.randint(0, self.size - 1) for x in xrange(self.size)]

    sorter = self.class_()
    data = data_orig[:]
    debug("%s for data size: %d, try #%d" % (sorter.__class__.__name__, self.size, i+1))
    t1 = time.clock()
    sorter.sort(data)
    t2 = time.clock()
    debug("Took: %0.4fms, shifts: %d, comparisons: %d" % ((t2-t1)*1000.0, sorter.shifts, sorter.comps))

class_ 是对 InsertionSort 类的引用。 对于 size = 1000 和 5 次重复,我得到以下结果:

InsertionSort for data size: 1000, try #1
Took: 39.5341ms, shifts: 254340, comparisons: 255331
InsertionSort for data size: 1000, try #2
Took: 6.0765ms, shifts: 250778, comparisons: 251772
InsertionSort for data size: 1000, try #3
Took: 6.9946ms, shifts: 254189, comparisons: 255180
InsertionSort for data size: 1000, try #4
Took: 6.7421ms, shifts: 252162, comparisons: 253156
InsertionSort for data size: 1000, try #5
Took: 5.9584ms, shifts: 241412, comparisons: 242404

对于每种排序算法,每次我运行程序时,第一个结果都比其他结果大。我用 PyPy 运行它(用 Python 看起来还可以,但速度要慢得多)。

我知道我可以简单地省略第一个结果,但这个解决方案并不让我满意 :-)

有什么想法吗?

【问题讨论】:

    标签: python performance timer pypy


    【解决方案1】:

    因为这就是 PyPy 的全部意义所在。它是一个优化的即时编译器,这意味着你运行一段代码的次数越多,它得到的优化就越多。第一次运行它,它还没有机会做任何优化,所以结果会很慢。后续运行将考虑第一次的经验教训,因此会更快。

    【讨论】:

    • 这个。来自pypy.org/performance.html一般来说,如果您要测量像服务器这样长时间运行的东西,请确保在运行基准测试之前预热您的程序
    • 值得注意的是,即使在 CPython 中,第一次它也会有点慢,因为有些东西会被加载到磁盘缓存中,甚至可能是 .py 文件被编译成.pyc 文件等。“基准测试前热身”的想法始终是必要的。 PyPy 使其变得更加明显必要这一事实可能应该算作额外好处。
    • 所以基本上省略前两次测量是个好主意,或者有没有更好的解决方案来预热我的程序?我关心结果。
    猜你喜欢
    • 2017-06-03
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2018-11-30
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多