Python 的 C++ 扩展 - 安全内存访问和内存布局
C++ extension to Python - safe memory access, and memory layout
我正在使用作用于 Numpy 数组(非常大)的 C++ 函数扩展 python 代码。
由于遗留问题,我目前同时拥有 PyBind 和 Python API 函数,两者都适用于 Python 3.6 及更高版本。
一旦我通过 ptr 访问内存,我很想确保内存布局与此 ptr 下的 c++ 数组完全对应。
我发现在这两种情况下,转置数组在 ptr 中的内容完全相同。我还发现通过 Python API 发送的子数组在 c++ 中给出了与完整数组完全相同的 ptr。在开发和测试过程中,我还观察到更多我认为奇怪的例子,但无法再重现它们。
到目前为止,我在互联网上找不到任何食谱。我的解决方案是复制 Python 中的所有输入数组,例如
f(a.copy(), b.copy())
看起来效果不错。
这是 optimal/sufficient 解决方案吗?
我对如何生成输入数组没有任何限制。转置、子数组、整形,任意组合。
对于 pybind11,您可以使用 py::array::c_style
标志,如 Matt Eding 的 link 中所述。 Numpy 的 C API 通过 NPY_ARRAY_C_CONTIGUOUS
标志提供了很多相同的功能。在任何一种情况下,如果需要满足布局要求,数组将被隐式地 copied;如果你更愿意拒绝这样的论点(为了避免无声的低效率),你必须自己检查数组的 flags
。
我正在使用作用于 Numpy 数组(非常大)的 C++ 函数扩展 python 代码。 由于遗留问题,我目前同时拥有 PyBind 和 Python API 函数,两者都适用于 Python 3.6 及更高版本。 一旦我通过 ptr 访问内存,我很想确保内存布局与此 ptr 下的 c++ 数组完全对应。 我发现在这两种情况下,转置数组在 ptr 中的内容完全相同。我还发现通过 Python API 发送的子数组在 c++ 中给出了与完整数组完全相同的 ptr。在开发和测试过程中,我还观察到更多我认为奇怪的例子,但无法再重现它们。 到目前为止,我在互联网上找不到任何食谱。我的解决方案是复制 Python 中的所有输入数组,例如 f(a.copy(), b.copy())
看起来效果不错。 这是 optimal/sufficient 解决方案吗? 我对如何生成输入数组没有任何限制。转置、子数组、整形,任意组合。
对于 pybind11,您可以使用 py::array::c_style
标志,如 Matt Eding 的 link 中所述。 Numpy 的 C API 通过 NPY_ARRAY_C_CONTIGUOUS
标志提供了很多相同的功能。在任何一种情况下,如果需要满足布局要求,数组将被隐式地 copied;如果你更愿意拒绝这样的论点(为了避免无声的低效率),你必须自己检查数组的 flags
。