Skip to main content
 首页 » 编程设计

python之迭代 Python3 map 的最快方法

2025年01月19日35linjiqin

我最近问了this问题,我修改了其中一个使用循环的解决方案,改为使用 map 。当然,在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 对象然后对其进行迭代比在真实循环中执行回调效率低。我的问题是:是否有更好的方法来使用 map 来在构建时执行回调,或者是否有比使用 any 更快的遍历 map 的方法?作为引用,以下是每个的运行时间:

#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) 

请您参考如下方法:

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