首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python集合模块中的defaultdict真的比使用setdefault快吗?

Python集合模块中的defaultdict真的比使用setdefault快吗?
EN

Stack Overflow用户
提问于 2012-09-24 04:25:48
回答 1查看 7.8K关注 0票数 18

我见过其他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) ]

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-24 04:38:10

是的,确实存在一些“错误”:

您已将(default)dict的创建放入语句中,而不是放入设置中。构造一个新的defaultdict比构建一个普通的dict更昂贵,而且这通常不是您应该在程序中分析的瓶颈-毕竟,您只构建了一次数据结构,但是您需要多次使用它们。

如果您像下面这样进行测试,您会发现defaultdict操作确实更快:

>>> import timeit
>>> setup1 = """from collections import defaultdict
... s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
... d = defaultdict(list)"""
>>> stmt1 = """for k, v in s:
...     d[k].append(v)"""
>>> setup2 = """s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
... d = {}"""
>>> stmt2 = """for k, v in s:
...     d.setdefault(k, []).append(v)"""
>>> timeit.timeit(setup=setup1, stmt=stmt1)
1.0283400125194078
>>> timeit.timeit(setup=setup2, stmt=stmt2)
1.7767367580925395

Win7 x64上的Python2.7.3。

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12555967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档