Re: [問題] List擴編的處理速度...

看板Python作者 (sbr)時間15年前 (2009/04/25 17:02), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串7/9 (看更多)
※ 引述《keitheis (無)》之銘言: : import timeit : run_test1 = ''' : import testit : testit.test1(testit.al, testit.bl) : ''' : run_test2 = ''' : import testit : testit.test2(testit.al, testit.bl) : ''' : run_test3 = ''' : import testit : testit.test3(testit.al, testit.bl) : ''' : al = [] : bl = [] : for i in range(1000): : al.append(i) : bl.append(999 -i) : def test1(al, bl): : al = al + bl : def test2(al, bl): : al.extend(bl) : def test3(al, bl): : al += bl : if __name__ == '__main__': : times = 100000 : t1 = timeit.Timer(stmt=run_test1) : print "%.8f sec/pass" % (t1.timeit(number=times)/times) : t2 = timeit.Timer(stmt=run_test2) : print "%.8f sec/pass" % (t2.timeit(number=times)/times) : t3 = timeit.Timer(stmt=run_test3) : print "%.8f sec/pass" % (t3.timeit(number=times)/times) : # See also: http://docs.python.org/library/timeit.html : 附帶這個測試的 output 作為參考 : 0.00002528 sec/pass : 0.00002075 sec/pass : 0.00002029 sec/pass : PS. 就算這麼做,還是要跑第二次之後才比較接近實際上想看到的差異 : 第一次 : % python testit.py : 0.00002639 sec/pass : 0.00002135 sec/pass : 0.00002575 sec/pass : 第二次 : % python testit.py : 0.00002557 sec/pass : 0.00002103 sec/pass : 0.00001995 sec/pass : 第三次 : % python testit.py : 0.00002528 sec/pass : 0.00002075 sec/pass : 0.00002029 sec/pass 請問你測試的 Python 版本是? 依照上述的碼來說,依照 Python 2.5.4 內附的 timeit module 的設計來看,test2 與 test3 重複執行多次,會導致 testit module loaded 後 al 參考的 list object 一直作串接動作而變長(長度超過 100M)。 重複跑 test2 與 test3 會比 test1 多許多記憶體配置與 memory copy 的操作, 我不認為你跑出來的量測結果是合理的(test2/test3 應該比 test1 慢上許多)。 是否你使用的 timeit 與 Python 2.5.4 內附的版本不同? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.173.134.233 ※ 編輯: sbrhsieh 來自: 218.173.134.233 (04/25 17:53)
文章代碼(AID): #19yj6KvY (Python)
討論串 (同標題文章)
文章代碼(AID): #19yj6KvY (Python)