迭代Python3地图的最快方法

时间:2018-04-26 18:39:53

标签: python python-3.x dictionary iterator mapping

我最近问过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)

1 个答案:

答案 0 :(得分:0)

这个问题的答案很简单,感谢@ Aran-Fey教我。这不是mapany的一个很好的用例,因为循环不是为了返回任何东西,而是为了修改字典。使用mapany会产生不必要的副作用,即创建地图对象并在迭代后返回布尔值,这两者都不是必需的。除了不太可读之外,我的“单行”产生两个不需要的输出,而普通循环没有这样的东西。因此,除了在运行时只有一半的速度之外,我的方法也有这些不必要的副作用,因此不应该使用,简单明了。