在C++中高效地执行数学Python表达式

2024-09-30 02:17:35 发布

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

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

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

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

这里是初始化代码:

^{pr2}$

这里是经过多次求值的代码:

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++函数,可以有效地调用它?或者还有其他选择吗?使用symbolicc++


Tags: 方法字符串代码程序表达式main数学sin
1条回答
网友
1楼 · 发布于 2024-09-30 02:17:35

我建议将所有的输入作为数组/向量传递给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);

相关问题 更多 >

    热门问题