【问题标题】:Cythonizing for loops that iterate over generatorsCythonizing for 遍历生成器的循环
【发布时间】:2014-07-20 19:54:11
【问题描述】:

我的 Python 代码有很多循环,这些循环使用来自 Python 生成器的数据。有些还重新生成处理后的数据。这是一个瓶颈,我想加快这部分的速度,并正在考虑使用 Cython。

处理生成器和产量的推荐方法是什么。我愿意

  • 在没有数据副本的情况下将 Python 生成器转换为 Cython
  • 使 Cython for 循环使用 Python 生成器生成的数据
  • 像生成器一样生成数据

我猜这是一个足够常见的用例,推荐的方法是什么。

【问题讨论】:

  • 您需要提供更多详细信息。另外,请解释为什么您认为使用 cython 是可行的方法。可能会有更好的解决方案。
  • 对于在此处搜索 Cython 错误的任何人:“yield not supported here”,请确保您写的是def,而不是cpdefgroups.google.com/forum/#!topic/cython-users/DSJ_DlwCHHw

标签: python for-loop generator cython coroutine


【解决方案1】:

一些建议:

  • Cython 支持开箱即用的生成器,因此您应该尝试将带有生成器的 Python 代码传递给 cython,然后看看您获得了什么样的加速。
  • 下一步是在循环中添加尽可能多的静态类型信息,以加快生成器的工作速度。
  • Python 生成器很酷,但如果性能很重要,它们并不是最快的处理方式。将瓶颈转换为使用连续数组会更好。
  • 查看 Cython 的类型化内存视图。
  • 您还可以将 Cython 与 C++ std::vectors 和其他高性能容器对象一起使用。

我们需要有关您的目标和限制的更多信息,以便在此处提供更多帮助。一个精简的例子会很有帮助。

【讨论】:

  • 我有未知长度的流管道。在这种情况下,生成器和协程会产生更简洁的代码。我将尝试使用 Cython 生成器,这是新增功能吗?
  • 您可能必须在代码的纯度上做出妥协才能获得所需的性能。由于 C 本身不支持生成器,因此 Cython 必须引入大量额外调用才能使它们工作。不过,它们仍然会比纯 Python 生成器更快。数组在 C 中非常快,因此您可以从中获得更好的性能。
  • 您可能会考虑混合缓冲解决方案:您可以存储一个 C 数组或类型化的 memorview,用它们进行批量计算,然后一个一个地产生结果。通过这种方式,您可以保留流式算法,同时受益于数组的性能和连续的内存访问。
  • 是的,当然,这些流确实按照您的说明进行了缓冲和生成。真的很可惜,C 选择省略协程抽象。您能否指出 Cython 中有关产量的权威文档。谷歌点击给了我相互矛盾的说法,可能是因为这个功能是后来添加的。
  • 您能否指出 Cython 中产量的权威文档,这就是我需要关闭它作为接受的全部内容,并感谢您的回答。
猜你喜欢
  • 2020-11-17
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
相关资源
最近更新 更多