在c++中高效地执行数学Python表达式
Efficiently execute mathematical Python expression in C++ many
我有一个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("%sn",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++函数?或者还有其他选择吗?也可以使用symbolic++
我建议将您的所有输入作为数组/向量传递给您的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);
相关文章:
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- Pybind11:将元组列表从Python传递到C++
- (C++)分析树以计算返回错误值的简单算术表达式
- 如何在c++中使用引用实现类似python的行为
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 递归列出所有目录中的C++与Python与Ruby的性能
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- IPC使用多个管道和分支进程来运行Python程序
- 从python中调用C++函数并获取返回值
- 使用 Python 和正则表达式提取源代码中的C++注释
- python中的正则表达式删除了太多
- 正则表达式,用于类似 python 的函数参数解析
- 从C++调用 Python 或 Lua 来计算表达式,仅在需要时计算未知变量
- Python -> C++ 习语:将 lambda 表达式存储在映射/容器中
- 将C++Boost正则表达式转换为Python正则表达式
- Python RE -正则表达式,用于匹配带有转义引号的类似printf格式字符串
- 将Python正则表达式转置为PCRE
- 在c++中高效地执行数学Python表达式