我有一个python程序,它生成一个像
这样的数学表达式exp(sin(x-y))**2
现在我想把它交给我的C ++程序,它必须用不同的x,y值来评估这个表达式。我的第一种方法是将Python.h库与PyRun_String一起使用。
这里是初始化代码:
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_String解析字符串实在太慢了。有没有办法直接将Python表达式转换为C ++函数,可以有效地调用?或者有其他选择吗?使用像symbolicc ++
这样的东西也没关系答案 0 :(得分:1)
我建议将所有输入作为数组/向量传递给c ++&立即解决所有问题。另外,试试Py_CompileString
& PyEval_EvalCode
代替PyRun_String
。我不得不解决数以百万计的方程式发现速度提高了10倍。
下面是一个简单'a + b'
的示例,但是对于包含任意数量变量的任何方程,可以将其概括为更多for循环。对于我的机器上的一百万个值,在不到一秒的时间内完成(相比PyRun_String
的10秒)。
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);