我用 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()。