Python:进程平均时间,前一个/两个慢得多

Dav*_*ave 1 python performance pypy timer

我正在编写一些使用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))
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

对于每个排序算法,每次运行程序时,第一个结果都比其他结果大.我用PyPy运行它(使用Python似乎没问题,但速度慢得多).

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

有任何想法吗?

Dan*_*man 5

因为那是PyPy的重点.它是一个优化的即时编译器,这意味着运行一段代码越多,它就越优化.第一次运行它时,它没有机会进行任何优化,因此结果会很慢.后续运行将考虑从第一次学到的经验教训,因此会更快.

  • 这个.来自http://pypy.org/performance.html:**一般情况下,如果您正在测量像服务器一样长时间运行的东西,请确保在运行基准测试之前预热程序** (3认同)