在我的代码中(见下文),我首先使用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()
想出一个折衷办法!我将把Python的值复制到C++一次,然后只从C++到Python的数据引用。p>
相关问题 更多 >
编程相关推荐