何时使用 c 或 cpp 来加速 python 或 matlab 实现?

When to use c or cpp to accelerate a python or matlab implementation?

我想创建一个房间脉冲响应的特例。我正在关注 this implemetation for a room-impulse-response generator. I am also following this tutorial 以将 c++\c 与 python.

集成

根据教程:

  1. You want to speed up a particular section of your Python code by converting a critical section to C. Not only does C have a faster execution speed, but it also allows you to break free from the limitations of the GIL, provided you’re careful.

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

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

C++ 代码编译成机器代码。这使得它比解释器语言更快(但是,如果您不知道自己在做什么,并不是所有用 C++ 编写的代码都比 Python 代码快)。在 C++ 中,您可以直接访问数据指针并使用 SIMD instructions on them to make them multiple times faster. You can also multi-thread your loops and codes to make them run even faster (either explicit multi-threading or tools like OpenMP)。你不能用高级语言做这些事情(至少不能正确地做)。

何时使用 C++ 加速 Python

并非代码的每一部分都值得优化。您应该只优化计算量大且 bottleneck of your program. These parts can be written in C or C++ and exposed to python by using bindings (by using pybind11 for example). Big machine learning libraries like PyTorch and TensorFlow 的部分。

专用硬件

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

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

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