使用迭代器的最快(最Pythonic)的方式

2024-01-30

我很好奇使用迭代器最快的方法是什么,也是最 Pythonic 的方法。

例如,假设我想创建一个迭代器map内置函数会累积一些东西作为副作用。我实际上并不关心结果map,只是副作用,所以我想以尽可能少的开销或样板来完成迭代。就像是:

my_set = set()
my_map = map(lambda x, y: my_set.add((x, y)), my_x, my_y)

在这个例子中,我只是想通过迭代器来积累东西my_set, and my_set在我真正跑完之前只是一个空集my_map。就像是:

for _ in my_map:
    pass

或裸体

[_ for _ in my_map]

有效,但它们都感觉笨重。有没有一种更 Pythonic 的方法来确保迭代器快速迭代,以便您可以从一些副作用中受益?


基准

我对上述两种方法进行了测试,结果如下:

my_x = np.random.randint(100, size=int(1e6))
my_y = np.random.randint(100, size=int(1e6))

with my_set and my_map如上所定义。我用 timeit 得到了以下结果:

for _ in my_map:
    pass
468 ms ± 20.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

[_ for _ in my_map]
476 ms ± 12.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

两者之间没有真正的区别,而且都感觉笨重。

注意,我得到了类似的性能list(my_map),这是评论中的建议。


虽然您不应该仅仅为了副作用而创建映射对象,但实际上有一个在itertools docs https://docs.python.org/3/library/itertools.html#itertools-recipes:

def consume(iterator, n=None):
    "Advance the iterator n-steps ahead. If n is None, consume entirely."
    # Use functions that consume iterators at C speed.
    if n is None:
        # feed the entire iterator into a zero-length deque
        collections.deque(iterator, maxlen=0)
    else:
        # advance to the empty slice starting at position n
        next(islice(iterator, n, n), None)

对于“完全消耗”的情况,可以简化为

def consume(iterator):
    collections.deque(iterator, maxlen=0)

Using collections.deque这种方式可以避免存储所有元素(因为maxlen=0)并以 C 速度迭代,没有字节码解释开销。甚至还有一个专用快速通道 https://github.com/python/cpython/blob/v3.6.5/Modules/_collectionsmodule.c#L356在双端队列实现中使用maxlen=0deque 来消耗迭代器。

Timing:

In [1]: import collections

In [2]: x = range(1000)

In [3]: %%timeit
   ...: i = iter(x)
   ...: for _ in i:
   ...:     pass
   ...: 
16.5 µs ± 829 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [4]: %%timeit
   ...: i = iter(x)
   ...: collections.deque(i, maxlen=0)
   ...: 
12 µs ± 566 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

当然,这都是基于CPython的。解释器开销的整体性质与其他 Python 实现非常不同,并且maxlen=0快速路径特定于 CPython。看阿巴纳特的回答 https://stackoverflow.com/a/50938287/对于其他 Python 实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用迭代器的最快(最Pythonic)的方式 的相关文章

随机推荐

  • 禁用 Android 浏览器的输入覆盖?

    我有一个带有一些文本输入的网页 Android 浏览器 至少在 Android 2 3 4 上 这是我现在所拥有的 似乎将其自己的控制覆盖在焦点页面上的输入上 问题是覆盖的控件是一个白色的矩形 看起来很丑 有没有办法禁用它 或者以某种方式设
  • SASS、Rails 3.1:在供应商/资产中加载样式表

    我正在使用 SASS 在 Rails 3 1 sass rails 3 1 应用程序中加载样式表 例如 sass 部分app assets stylesheets被加载使用 import in application sass import
  • 美洲狮 .state 文件

    我正在尝试使用 Capistrano 部署我的 Rails 应用程序和 puma 在部署即将结束时 它尝试运行 bundle exec pumactl S home deployer production shared sockets pu
  • Android:将 FEATURE_NO_TITLE 与自定义 ViewGroup 一起使用会在窗口顶部留下空间

    我正在尝试创建一个自定义 ViewGroup 并且我想将其与全屏应用程序一起使用 我正在使用 requestWindowFeature Window FEATURE NO TITLE 来隐藏标题栏 标题栏没有显示 但它仍然占用窗口顶部的空间
  • 即使在 seteuid 之后,root priv 也无法在 python 中删除。一个错误?

    即使在 seteuid 之后 root priv 也无法在 python 中删除 一个错误 EDIT摘要 我忘了删除 gid 不过 接受的答案可能会对您有所帮助 你好 我无法在 Linux 上删除 python 3 2 中的 root 权限
  • 如何实现多对多对多的数据库关系?

    我正在构建一个 SQLite 数据库 但不知道如何继续这种情况 我将使用一个现实世界的例子来解释我需要什么 我有一个在各个州的许多商店销售的产品清单 不是每个Store出售特定的Product根本不会 而那些这样做的人可能只能以一种方式出售
  • 哪里可以获得纯 C++ Lame MP3 编码器 - PCM 到 MP3 示例?

    所以我需要的只是一个简单的函数来设置它 吃传入的 PCM 速率 例如 接近 44100 的速率 它的通道 例如 2 和位 例如 16 和理想的 128 kb s 速率 另一种则采用 PCM 数据并将其编码为纯 MP3 帧 我知道这看起来像是
  • 如何使用 python 连接到 SQL Server 数据库? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在尝试连接到已创建且位于服务器上的 SQL 数据库 我如何使用 python 连接到这个数据库 我尝试过使用java
  • 为什么我的 XHR 调用正在等待对方返回响应

    我在页面中有一个 iframe 它不断轮询服务器以获取由 主 XHR 主动更新的会话变量 所以基本上 主 XHR 运行并执行其任务 在运行时更新会话变量 通常需要一段时间 比如说10秒以上 当主 XHR 运行时 我使用并行 XHR 请求轮询
  • 动画按钮阻止排毒

    这就是我所说的动画按钮 我让它有一个 ID 但 Detox 却无法以某种方式找到它 Detox 通过自动将您的测试与应用程序同步来消除不稳定的情况 如果应用程序繁忙 测试无法继续到下一行 仅当应用程序空闲时测试才会恢复 Detox 非常密切
  • 从 Javascript 变量创建 xls 或 csv 文件

    我有一个使用 Javascript 执行一些计算然后绘制数据的应用程序 但我想添加一个选项 以便用户能够实际将数据下载到 csv 或 xls 文件中 Javascript 或其他方法 中是否有一种方法可以让用户按下按钮 然后它会提示他们输入
  • Cython:“+”的操作数类型无效(btVector3;btVector3)

    子弹 pxd cdef extern from bullet LinearMath btVector3 h cdef cppclass btVector3 btVector3 float float float except btVecto
  • 如何从移动网站打开 iOS 6 地图?

    我有一个移动网站 有一个链接可以从我的网站内打开 Google 地图应用程序 然而 现在随着 ios6 的新版本的出现 原生版本的 google 地图不再存在 现在链接将打开到基于 safari 的 google 地图 我宁愿在本地苹果地图
  • 错误检查:CloudKit MacCatalyst didReceiveRemoteNotification

    我正在使用 MacCatalyst 将 iOS iPadOS 应用程序移植到 MacOS 该应用程序以所有方式使用 CloudKit 和功能 除了以下一种方式 UIApplicationDelegate方法 didReceiveRemote
  • Asp.NET Core json 文件或数据路径 - 将其放在哪里

    我在 NET MVC 中 我希望读取一个 JSON 文件 如下所示 JSON System IO File ReadAllText companyInfo json 然而我无法走上一条路 我不关心将 json 文件放在哪里 所以我要求提供放
  • Google 图像搜索:如何构建反向图像搜索 URL?

    我如何以编程方式通过java将图像转换为 某个字符串 以将其作为参数传递以在谷歌图像搜索中进行搜索 实际上我已经对图像进行了一些base64转换 但它与谷歌在其图像搜索引擎中所做的不同 我做了这样的转换 java 7 import java
  • 带有 GNU STL 的 GCC 4.8 会为 std::string 构造函数生成错误代码?

    一些 C 代码 void func const std string theString std string theString theString theString more string std cout lt lt theStri
  • “ionic”不被识别为内部或外部命令

    我已经成功安装了 Ionic 事实上 我已经运行过很多次了 它工作得很好 在我的浏览器上使用 ionicserve 命令 但是当我已经好几天没有做 Ionic stuffs 了 今天早上尝试这样做时 该命令现在无法识别 这有什么问题吗 运行
  • Bootstrap 表 data-url

    我使用引导表 http wenzhixin net cn p bootstrap table docs examples html http wenzhixin net cn p bootstrap table docs examples
  • 使用迭代器的最快(最Pythonic)的方式

    我很好奇使用迭代器最快的方法是什么 也是最 Pythonic 的方法 例如 假设我想创建一个迭代器map内置函数会累积一些东西作为副作用 我实际上并不关心结果map 只是副作用 所以我想以尽可能少的开销或样板来完成迭代 就像是 my set