Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中高效执行数学Python表达式+;许多的_Python_C++_Math - Fatal编程技术网

在C+中高效执行数学Python表达式+;许多的

在C+中高效执行数学Python表达式+;许多的,python,c++,math,Python,C++,Math,我有一个python程序,它生成一个数学表达式,如 exp(sin(x-y))**2 现在我想把这个给我的C++程序,它必须用不同的x,y值来评估这个表达式。我的第一种方法是使用pyron_字符串的Python.h库 这里是初始化代码: func=function; Py_Initialize(); memset(pythonString,0,strlen(pythonString)); // add whiteNoise Kernel sprintf(pythonS

我有一个python程序,它生成一个数学表达式,如

exp(sin(x-y))**2

现在我想把这个给我的C++程序,它必须用不同的x,y值来评估这个表达式。我的第一种方法是使用pyron_字符串的Python.h库

这里是初始化代码:

func=function;
Py_Initialize();
    memset(pythonString,0,strlen(pythonString));

    // add whiteNoise Kernel
    sprintf(pythonString,"from math import *;func=lambda x,y:(%s+0.1*(x==y))",function);
    //printf("%s\n",pythonString);
    PyRun_SimpleString(pythonString);
这里是经过多次计算的代码:

char execString[200];
memset(execString,0,strlen(execString));

sprintf(execString,"result=func(%f,%f)",x1[0],  x2[0]);

PyObject* main = PyImport_AddModule("__main__");
PyObject* globalDictionary = PyModule_GetDict(main);
PyObject* localDictionary = PyDict_New();

//create the dictionaries as shown above

PyRun_String(execString, Py_file_input, globalDictionary, localDictionary);
double result = PyFloat_AsDouble(PyDict_GetItemString(localDictionary, "result"));

但是,我认为每次都用PyRun_字符串解析字符串实在太慢了。有没有一种方法可以直接将Python表达式转换成C++函数,可以有效地调用它?或者有其他选择吗?也可以使用象符号C++< /P> < P>我建议把所有输入作为数组/向量传递给C++,并立即解决所有问题。另外,请尝试使用
Py\u编译器字符串
&
PyEval\u EvalCode
而不是
PyRun\u字符串
。我不得不解上百万个方程&发现速度提高了10倍

下面是一个简单的
'a+b'
的例子,但通过更多的for循环,可以将其推广到任何变量数的方程。对于一百万个值,在我的机器上只需不到一秒钟即可完成以下操作(相比之下,
PyRun\u String
)只需10秒钟


这与问题无关,但是。。。你是否试过看pypyp在重量级重量级C -Python编程之前是否提供了必要的性能?我不知道这是否有用,但是我有一个可以用来生成C++表达式源代码的表达式(实际上它可以生成任何你定义的代码)@这似乎很有用。我会尝试一下:)@XapaJIaMnu不,我没有尝试过,我假设它不会运行,因为python代码使用专有库。它一定是python代码,还是有些人也会这样做?
PyObject* main = PyImport_AddModule("__main__");
PyObject* globalDict = PyModule_GetDict(main);
PyCodeObject* code = (PyCodeObject*) Py_CompileString("a + b", "My Eqn", Py_eval_input);
for (millions of values in input) {
    PyObject* localDict = PyDict_New();
    PyObject* oA = PyFloat_FromDouble(a);  // 'a' from input
    PyObject* oB = PyFloat_FromDouble(b);  // 'b' from input
    PyDict_SetItemString(localDict, "a", oA);
    PyDict_SetItemString(localDict, "b", oB);
    PyObject* pyRes = PyEval_EvalCode(code, globalDict, localDict);
    r = PyFloat_AsDouble(pyRes);
    // put r in output array

    Py_DECREF(pyRes);
    Py_DECREF(localDict)
}
Py_DECREF(code);