【问题标题】:Pybind11: returning a large array in a C++ function significantly increases computing time in pythonPybind11:在 C++ 函数中返回一个大数组显着增加了 python 中的计算时间
【发布时间】:2020-08-21 18:22:11
【问题描述】:

我编写了一个小 C++ 脚本并使用 pybind11 使 C++ 函数在 python 中可用。从 python 调用时,C++ 函数需要大约 4 秒才能终止。 C++ 函数返回一个长度为 54.346.383 的大数组。 出于好奇,我修改了 C++ 函数并返回了一个长度为 7373 的不同数组,而没有更改代码中的任何其他内容。现在 C++ 函数在 1 秒后终止。因此,据我了解,随着对象大小的增加,将对象从 C++ 传输到 Python 成为一个巨大的瓶颈。

有没有更聪明的方法来处理这个问题?也许使用指针? (我对 C++ 和 pybind11 完全陌生)

#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>
#include <vector>
#include <numeric>

namespace py = pybind11;

std::vector<double> isoCdf_seq(std::vector<double> array_w, std::vector<double> W, std::vector<double>  Y, std::vector<int>  posY, std::vector<double>  array_y) {

std::vector<double> CDF;
CDF.reserve(m * mY);

// some code

return CDF;

【问题讨论】:

    标签: python c++ pybind11


    【解决方案1】:

    它正在构建一个 Python 浮点数列表,这有很多开销。我建议在 Python 端使用 NumPy 数组,此处解释:returning numpy arrays via pybind11

    这样,您可以一次分配数组内存,Python 可以将其作为 NumPy 数组引用,而无需分配 5400 万个微小对象和对它们的引用。

    【讨论】:

    • 完美和一个快速的后续问题:当使用 python 中的 numpy 数组作为 C++ 中的函数输入时,怎么样。这也会导致大量开销吗?例如,传输 C 连续 numpy 数组而不是常规 numpy 数组是否更快? (在 C++ 中,我使用 std::memcpy 将 np 数组转换为 C++ 对象)
    • @evva:您应该尝试将 NumPy 数组从 Python 传递到 C++,然后直接访问其内存,仅当您确实需要副本时才对其进行内存复制(或复制到向量中,同样的事情)。无论 C++ 接收的数组是完整的 NumPy 对象、Python 缓冲区或内存视图,还是指向数据和大小的指针,任何避免将其序列化为新存储格式的方法都会有所帮助。尽管如此,没有什么比序列化成 Python 列表更慢了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2021-12-13
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    相关资源
    最近更新 更多