【问题标题】:When to use c or cpp to accelerate a python or matlab implementation?何时使用 c 或 cpp 来加速 python 或 matlab 实现?
【发布时间】:2022-01-16 11:39:24
【问题描述】:

我想创建一个房间脉冲响应的特例。我正在关注this implemetation 的房间脉冲响应发生器。我也在关注this tutorial 将 c++\c 与 python 集成。

根据教程:

  1. 您希望通过将关键部分转换为 C 来加速 Python 代码的特定部分。C 不仅具有更快的执行速度,而且还允许您摆脱 GIL 的限制,前提是您'小心。

但是,在查看 MATLAB 示例时,我看到 cpp 代码段所做的只是常规循环和数学计算。在这个例子或任何其他例子中,c\cpp 会以何种方式比 python\MATLAB 更快?任何通用 c\cpp 代码会运行得更快吗?如果是这样,为什么?如果没有,在选择 c\cpp 段实现时,我需要寻找哪些指标? c\cpp 中哪些操作更快?

【问题讨论】:

  • 这太宽泛了,无法完全回答。在寻求优化 python 或 matlab 时,是否解释或编译任何内容是您最不关心的问题。一个简单的经验法则是,如果您看到大量循环支配您的运行时间,您可能需要调用 C++。

标签: python c++ c matlab cross-language


【解决方案1】:

为什么要使用 C++ 来加速 Python

C++ 代码编译成机器码。与解释器语言相比,这使其速度更快(但是,如果您不知道自己在做什么,并非所有用 C++ 编写的代码都比 Python 代码快)。在 C++ 中,您可以直接访问数据指针并在它们上使用 SIMD 指令以使其速度提高数倍。您还可以对循环和代码进行多线程处理,以使它们运行得更快(显式多线程或OpenMP 等工具)。你不能用高级语言做这些事情(至少是正确的)。

何时使用 C++ 加速 Python

并非代码的每一部分都值得优化。您应该只优化计算量大并且是程序的bottleneck 的部分。这些部分可以用 C 或 C++ 编写,并通过使用绑定(例如使用 pybind11)暴露给 python。像 PyTorchTensorFlow 这样的大型机器学习库就是这样做的。

专用硬件

有时拥有优化良好的 C++ CPU 代码是不够的。然后您可以评估您的问题,如果合适,您可以使用专用硬件。这些硬件可以从低级(如 FPGA)到高级硬件,如我们系统上通常拥有的专用显卡(如为 NVIDIA GPU 编程的CUDA)。

低级和高级语言的常规代码差异

即使您不使用多线程或 SIMD 操作,使用可编译的语言也有很大的优势。例如,与循环 Python 数组或在 MATLAB 中使用 for 相比,循环 C 数组或 C++ 中的 std::vector 可以快 100 倍以上(最近 JIT compiling 被用于加速高级语言,但仍然,存在差异)。这有很多原因,其中一些是在编译时识别并具有连续数组的基本数据类型。这就是为什么人们建议在简单的 Python 循环上使用 Numpy 向量化操作(对于 MATLAB 也是如此)。

【讨论】:

  • 在给定的 RIR 示例中,没有使用多线程方法。此外,我无法识别任何 simd 操作(我错过了任何操作吗?)。这是否意味着在这种情况下代码不会更快\更快?还是指针的使用足以降低计算复杂度?
  • @havakok 我也更新了我的答案来回答你的评论。
  • 知道了。非常感谢。
  • 被解释与 python 有多慢没有多大关系。
  • 是的,这里有很多因素。但我认为 python 本身不应该很快。我认为它应该是 C++ 的包装器,让事情变得简单。
猜你喜欢
  • 2021-09-03
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
相关资源
最近更新 更多