gpt4 book ai didi

python - Eigen和Numpy->将矩阵从Python传递到C++

转载 作者:行者123 更新时间:2023-12-02 09:52:35 25 4
gpt4 key购买 nike

我正在做一个模拟项目,并且试图找出在Python和C++之间传递矩阵的最佳方法。我正在使用Python的NumPy和C++的Eigen库,并且正在使用PyBind11使它们彼此通信。
在我的代码中(见下文),我首先在Python脚本中使用NumPy创建一些数组,然后将它们作为参数传递给C++类的构造函数(我称为rmodule),该函数实际上将是我的数值引擎。模拟。我希望我的C++类的实例具有这些NumPy数组作为对象属性(以便可以轻松地引用它们),但是我想知道这样做的最佳方法是什么。
如果我只是将类型从NumPy数组转换为Eigen矩阵,则PyBind必须将所有数据复制到C++程序中。尽管这似乎有很多开销,但我觉得如果与我使用矩阵进行的计算相比复制速度较快,则可以这样做。
我的另一选择是仅将对NumPy数组的引用传递给我的C++实例。这样,就不会在Python和C++之间来回复制数据了-数据将归Python所有并由C++类引用。我认为这可能会提高性能。但是,我不确定这样做是否会遇到麻烦-是否需要以某种方式解决GIL?如果这是更好的方法,我还应该记住还有什么其他事情?
TLDR:我正在使用Python进行文件I / O和C++进行计算。我应该在Python和C++之间来回复制数据,还是仅将数据归Python所有,并将对该数据的引用传递给C++?
任何帮助和建议,我们将不胜感激。

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()

最佳答案

想出了一个折衷方案!我将一次将值从Python复制到C++,然后仅将对数据的引用从C++复制到Python。

关于python - Eigen和Numpy->将矩阵从Python传递到C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63275672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com