作者sbrhsieh (sbr)
看板Python
标题Re: [问题] List扩编的处理速度...
时间Sat Apr 25 17:02:10 2009
※ 引述《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)