【发布时间】:2018-10-07 13:30:56
【问题描述】:
我最近问了this 的问题,我修改了其中一个使用循环的解决方案,改为使用地图。当然,在 Python3 中,map() 返回一个迭代器,并且在迭代结束之前不会执行回调。考虑以下字典和映射函数:
files = {'Code.py': 'Stan', 'Output.txt': 'Randy', 'Input.txt': 'Randy'}
是字典
mapped = {}
for k, v in files.items():
mapped.setdefault(v, []).append(k)
运行速度几乎是以下速度的两倍:
mapped = {}
any(map(lambda i: mapped.setdefault(i[1],[]).append(i[0]),files.items()))
我的(未受过教育的)猜测是,构建地图对象然后对其进行迭代比在真实循环中执行回调效率低。我的问题是:有没有更好的方法来使用map 来执行构建时的回调,或者有没有比使用any 更快的方法来遍历地图?作为参考,以下是每个的运行时:
#timeit
#using setdefault with any, lambda, map:
#1.46 µs ± 12.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
#using setdefault with loop:
#826 ns ± 2.75 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
【问题讨论】:
-
虽然我同意添加 Python 标记,但我不确定它是否应该是主标记,因为 Python2
map返回一个列表而不是迭代器。 -
什么是迭代某些东西的“稳健”方式?
-
你宁愿我写“快”吗?
-
也许一个好的答案是描述使用
any和map的副作用以及为什么循环是更好的选择。还没发的话我一会儿发一个 -
mapped.append.setdefault(v, []).append(k).. 是错字吗?.append.?
标签: python python-3.x dictionary iterator mapping