2012-11-07 14 views
1

我正在寫一些程序,使用Python進行排序算法比較。我想測量平均分揀時間。我在第一次測量時遇到問題。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_是插入排序類的引用。 對於大小= 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看起來好,但速度很慢)。

我知道我可以簡單地ommit第一的結果,但這種解決方案並不滿足我:-)

任何想法?

回答

5

因爲這就是PyPy的重點。這是一個優化即時編譯器,這意味着您運行的代碼越多,獲得的優化就越多。第一次運行它時,它沒有機會做任何優化,所以結果會很慢。後續運行將考慮到第一次吸取的教訓,所以速度會更快。

+3

這個。來自http://pypy.org/performance.html:**一般來說,在運行基準測試之前,確保你已經準備好了你的程序,如果你正在測量像服務器一樣長時間運行的東西** –

+0

值得注意的是,即使在CPython第一次會慢一些,因爲有些東西會被加載到磁盤緩存中,甚至可能被編譯成.pyc文件的.py文件等等。「基準測試之前熱身」的想法是必須的。 PyPy使其更顯得必要的事實應該算作是額外的好處。 – abarnert

+0

所以基本上這是一個好主意,省略前兩個測量或有沒有更好的解決方案來預熱我的程序?我關心結果。 – Dave