Re: [問題] List擴編的處理速度...
※ 引述《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)
討論串 (同標題文章)