dam*_*zam 17 python collections setdefault defaultdict python-collections
我见过其他Python程序员使用collections模块中的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)
Run Code Online (Sandbox Code Playgroud)
我通常使用setdefault来解决这个问题:
def main():
d = {}
for k, v in s:
d.setdefault(k, []).append(v)
Run Code Online (Sandbox Code Playgroud)
文档实际上声称使用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
Run Code Online (Sandbox Code Playgroud)
我如何设置测试有什么问题吗?
供参考,我使用的是Python 2.7.3 [GCC 4.2.1(Apple Inc. build 5666)
Tim*_*ker 23
是的,有一些"错误":
您已将创建的内容(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
Run Code Online (Sandbox Code Playgroud)
Win7 x64上的Python 2.7.3.
| 归档时间: |
|
| 查看次数: |
5930 次 |
| 最近记录: |