在Python的藏品模块defaultdict真的比存在使用它快?(Is the defaultdi

2019-07-31 20:12发布

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

我通常通过存在使用它,而不是走近这个问题:

def main():
    d = {}
    for k, v in s:
        d.setdefault(k, []).append(v)

该文档做其实要求,使用defaultdict比较快 ,但我看到了相反的测试自己,当是真实的:

$ 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(苹果公司建立5666)

Answer 1:

是的,有什么“错误”:

你已经把创建(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的Python 2.7.3。



文章来源: Is the defaultdict in Python's collections module really faster than using setdefault?