【问题标题】:How to accelerate array_t construction in pybind11如何在pybind11中加速array_t的构建
【发布时间】:2022-10-15 10:58:55
【问题描述】:

我用 C++ 用 Pytorch 调用 python。

C++ 生成一个向量并发送到 Python 以供神经网络进行推理。

但是发送向量是一个耗时的过程。 一个包含 500000 个浮点数的向量消耗 0.5 秒转向 array_t。

有没有更快的方法将向量传输到 array_t?任何帮助将不胜感激!

这是代码的一部分:

int main(){
        float list[500000];
        std::vector<float> v(list, list+length);
        py::array_t<float> args = py::cast(v); //consume 0.5 second
        py::module_ nd_to_tensor = py::module_::import("inference");
        py::object result = nd_to_tensor.attr("inference")(args);
}

我也尝试了下面的第二种方法,但是在 Python 中将向量变成张量需要 1.4 秒:

PYBIND11_MAKE_OPAQUE(std::vector<float>);
PYBIND11_EMBEDDED_MODULE(vectorbind, m) {
    m.doc() = "C++ type bindings created by py11bind";
    py::bind_vector<std::vector<float>>(m, "Vector");
}

int main(){
    std::vector<float> v(list, list+length);
    py::module_ nd_to_tensor = py::module_::import("inference");
    py::object result = nd_to_tensor.attr("inference")(&v);
}

这是Python代码:

def inference():
    tensor = torch.Tensor(Vector)

【问题讨论】:

    标签: python c++ pytorch stl pybind11


    【解决方案1】:

    问题解决了

    py::array_t<float> args = py::array_t<float>({length}, {4}, &list[0]);
    

    直接初始化 array_t 将是最好的方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      • 2018-11-10
      • 2011-01-15
      相关资源
      最近更新 更多