【问题标题】:Fastest way to iterate over a Python3 map迭代 Python3 映射的最快方法
【发布时间】: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 返回一个列表而不是迭代器。
  • 什么是迭代某些东西的“稳健”方式?
  • 你宁愿我写“快”吗?
  • 也许一个好的答案是描述使用 anymap 的副作用以及为什么循环是更好的选择。还没发的话我一会儿发一个
  • mapped.append.setdefault(v, []).append(k) .. 是错字吗? .append. ?

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


【解决方案1】:

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

【讨论】:

  • 附带说明,这仍然比使用 pandas 快得多
猜你喜欢
  • 2019-04-08
  • 2023-04-11
  • 2022-10-23
  • 2014-05-07
  • 2015-08-30
  • 2012-11-14
  • 2020-07-18
  • 2014-12-02
  • 2013-10-01
相关资源
最近更新 更多