【发布时间】:2015-03-04 07:32:07
【问题描述】:
我使用 timeit 获得了非常令人惊讶的结果,有人可以告诉我我做错了什么吗?我正在使用 Python 2.7。
这是speedtest_init.py文件的内容:
import random
to_count = [random.randint(0, 100) for r in range(60)]
这些是speedtest.py的内容:
__author__ = 'BlueTrin'
import timeit
def test_init1():
print(timeit.timeit('import speedtest_init'))
def test_counter1():
s = """\
d = defaultdict(int);
for i in speedtest_init.to_count:
d[i] += 1
"""
print(timeit.timeit(s, 'from collections import defaultdict; import speedtest_init;'))
def test_counter2():
print(timeit.timeit('d = Counter(speedtest_init.to_count);', 'from collections import Counter; import speedtest_init;'))
if __name__ == "__main__":
test_init1()
test_counter1()
test_counter2()
控制台输出为:
C:\Python27\python.exe C:/Dev/codility/chlorum2014/speedtest.py
2.71501962931
65.7090444503
91.2953839048
Process finished with exit code 0
我认为默认情况下timeit()会运行1000000次代码,所以我需要将时间除以1000000,但令人惊讶的是Counter比defaultdict()慢。
这是预期的吗?
编辑:
同样使用 dict 比 defaultdict(int) 更快:
def test_counter3():
s = """\
d = {};
for i in speedtest_init.to_count:
if i not in d:
d[i] = 1
else:
d[i] += 1
"""
print(timeit.timeit(stmt=s, setup='from collections import defaultdict; import speedtest_init;')
最后一个版本比 defaultdict(int) 更快,这意味着除非你更关心可读性,否则你应该使用 dict() 而不是 defaultdict()。
【问题讨论】:
标签: python python-2.7 counter timeit defaultdict