python - C++ 对 Python 的扩展——安全的内存访问和内存布局
问题描述
我正在使用作用于 Numpy 数组(非常大)的 c++ 函数来扩展 python 代码。由于遗留问题,我目前同时拥有 PyBind 和 Python API 函数,都适用于 Python 3.6 及更高版本。一旦我通过 ptr 访问内存,我很想确保内存布局与此 ptr 下的 c++ 数组完全对应。我发现在这两种情况下,转置数组在 ptr 中的内容完全相同。我还发现通过 Python API 发送的子数组在 c++ 中给出的 ptr 与完整数组完全相同。在开发和测试的过程中,我也观察到了更多我认为奇怪的例子,但不能再重现它们了。到目前为止,我在互联网上找不到任何食谱。我的解决方案是在 Python 中复制所有输入数组,例如 f(a.copy(), b.copy())
它似乎运作良好。这是最佳/充分的解决方案吗?我对如何生成输入数组没有任何限制。任何组合的转置、子阵列、重塑。
解决方案
使用 pybind11,您可以使用py::array::c_style
Matt Eding 链接中描述的标志。Numpy 的C API通过NPY_ARRAY_C_CONTIGUOUS
标志提供了几乎相同的功能。无论哪种情况,如果需要满足布局要求,数组将被隐式复制;如果您更愿意拒绝这样的论点(以避免沉默的低效率),您必须自己检查数组flags
。
推荐阅读
- java - 多个数据库的休眠会话
- dataset - 如何获取 OMNeT++ 模拟的日志文件
- android - 使用多个 Android 应用程序连接到一个 Firebase 项目
- r - 如何从日期时间中提取时间并绘制直方图
- javascript - js链接不适用于过滤的列表项
- c# - 我想从控制器获取数据以查看你能帮我吗
- postgresql - 如何使用位于同一台 AWS AMI 2 机器上的 TypeORM 通过 Express 连接到 PostgreSQL 服务器
- google-cloud-run - 尝试运行 Cloud Run 作业时,Cloud Scheduler 的权限被拒绝
- python - 图像传输项目中的Python Opencv深度错误
- python - 我一直在尝试从网络抓取工具收到的数据创建一个 csv 文件