从Python到C++的传递矩阵

2024-06-26 11:25:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究一个仿真项目,我在想办法在Python和C++之间传递矩阵的最好方法。我正在使用Python的NumPy和C++的Eigen库,我正在使用PyBind11让它们相互通信

在我的代码中(见下文),我首先使用Python脚本中的NoMPy创建一些数组,然后将这些参数作为C++类的构造函数传递给我,我称之为^ {CD1>},这将是我的模拟的数值引擎。我希望C++类的一个实例将这些麻木数组作为对象属性(这样它们可以很容易地引用),但我想知道做这件事的最佳方法是什么。p>< >如果我只是从一个麻木数组转换成一个特征矩阵,PyBind就必须把所有数据复制到C++程序中。虽然这看起来是一个很大的开销,但我觉得如果复制速度比我用矩阵做的计算快的话,这就可以了

我的另一个选择是只将一个NUMPY数组的引用传递给C++实例。这样,数据不会在Python和C++之间来回复制——它将被Python所拥有,并由C++类引用。我想这可能会使我的表演速度加快。然而,我不确定这样做是否会遇到麻烦——我是否必须以某种方式解决GIL问题?如果这是更好的方法,我还应该记住什么

< > >强> TLDR:<强> > EME>我使用Python进行文件I/O和C++计算。我应该在Python和C++之间来回复制数据,还是在Python的所有权下拥有数据,并将该数据的引用传递给C++?p>

非常感谢您的帮助和建议


C++代码:

#include <pybind11/pybind11.h>
#include <random>
#include <iostream>
#include "Eigen/Dense"

#define R = 8.134 // Universal Gas Constant (J mol^-1 ºK^-1)

namespace py = pybind11;

using namespace Eigen;

class rmodule {
    /** Encapsulated time-stepping logic that
        can be easily constructed and referenced
        by the Python interpreter.

        :attributes:
            C   - Concentration Vector
            F   - Standard ΔGº_f of metabolites
            T   - Temperature (ºK)
            S   - Stoichiometric Matrix
         */

    VectorXf C;
    VectorXf F;
    double   T = 0.0;
    MatrixXf S;

public:
    rmodule(VectorXf pyC, MatrixXf pyS, VectorXf pyF, double pyT) {
       /** Copies numpy array data into C++ Eigen classes. */
        C   = pyC;
        S   = pyS;
        F   = pyF;
        T   = pyT;
    }

    ~rmodule(){     // TODO -- Will need to free data structures
        ;
    }
};

PYBIND11_MODULE(reaction, m) {
    m.doc() = "ERT reaction module";    // TODO -- How to bind?

    py::class_<rmodule>(m, "rmodule")
        .def(py::init<>()) // Here is the Problem! What should I do here? Reference or value?
        ;
}

Python代码:

import parser
import react   # react is the name of my binary once I compile
import numpy as np

def main():
    """Program Driver"""

    P = parser.Parser("test1.txt")
    P.ReadData() # Builds numpy arrays

    C = P.GetC()    # Initial Concentrations #
    S = P.GetS()    # Stoichiometric Matrix #
    F = P.GetF()    # Standard ΔGº #

    rmodule = react.rmodule(C, S, F, T=273.15)


if __name__ == "__main__":
    main()

Tags: the数据方法代码pyimportnumpyinclude