【发布时间】:2012-09-15 09:04:00
【问题描述】:
我看到其他 Python 程序员使用集合模块中的 defaultdict 用于以下用例:
from collections import defaultdict
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
def main():
d = defaultdict(list)
for k, v in s:
d[k].append(v)
我通常使用 setdefault 来解决这个问题:
def main():
d = {}
for k, v in s:
d.setdefault(k, []).append(v)
文档实际上是 claim that using defaultdict is faster,但我在测试自己时看到了相反的情况:
$ python -mtimeit -s "from withsetdefault import main; s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)];" "main()"
100000 loops, best of 3: 4.51 usec per loop
$ python -mtimeit -s "from withdefaultdict import main; s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)];" "main()"
100000 loops, best of 3: 5.38 usec per loop
我设置测试的方式有问题吗?
作为参考,我使用的是 Python 2.7.3 [GCC 4.2.1 (Apple Inc. build 5666)
【问题讨论】:
-
一个测试文件是否包含
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]而另一个没有? -
@Claudiu:仔细阅读时间线。
-
您需要使用 很多 个更大的测试集,其中每个键有 2 个以上的值。
-
@MartijnPieters:我做到了。我不知道
withsetdefault.py和withdefaultdict.py中有什么。如果其中一个包含该行而另一个不包含该行,则可能会导致差异
标签: python collections defaultdict setdefault python-collections