从c++;每次都不加载文件 我有一个Python脚本,我需要调用很多次(大约160000次),而我可以用硬C++代码做的少一秒,如果我尝试加载和调用Python脚本来做这个,它可能需要几个小时!我认为,如果我只加载一次脚本,然后一遍又一遍地运行加载的脚本,速度会明显加快。不幸的是,我不知道怎么做。我不认为我可以使用ifstream加载文件,然后在字符串的所有行上使用PyRun\u SimpleString。但是,如果速度不快,是否可以在python中返回一个2D数组,然后将该数组转换为std::vector?

从c++;每次都不加载文件 我有一个Python脚本,我需要调用很多次(大约160000次),而我可以用硬C++代码做的少一秒,如果我尝试加载和调用Python脚本来做这个,它可能需要几个小时!我认为,如果我只加载一次脚本,然后一遍又一遍地运行加载的脚本,速度会明显加快。不幸的是,我不知道怎么做。我不认为我可以使用ifstream加载文件,然后在字符串的所有行上使用PyRun\u SimpleString。但是,如果速度不快,是否可以在python中返回一个2D数组,然后将该数组转换为std::vector?,python,c++,python-embedding,Python,C++,Python Embedding,在名为multiply.py的文件中考虑以下函数 #!/usr/bin/python3 def do_multiply(a, b): c = 0 for i in range(0, a): c += b return c 你的C++文件: // Load the function PyObject *pName = PyUnicode_FromString("multiply"); PyObject *pModule = PyImport

在名为
multiply.py
的文件中考虑以下函数

#!/usr/bin/python3

def do_multiply(a, b):
    c = 0
    for i in range(0, a):
        c += b
    return c
<>你的C++文件:

// Load the function 
PyObject *pName     = PyUnicode_FromString("multiply");
PyObject *pModule   = PyImport_Import(pName);
PyObject *pFunction = PyObject_GetAttrString(pModule, "do_multiply")
假设您要调用此函数3次,如下所示:

struct NumberPair 
{ 
    int x;
    int y;
};

std::vector<NumberPair> numberPairs { {1, 2}, {5, 6}, {10, 12} };

在调用
PyObject\u CallFunction
之间,不需要关闭模块,因此这应该不是问题。

如何确定脚本的输入?您使用<代码> PyRuniSimuleStase的建议意味着,您没有从C++代码中向脚本传递任何参数。如果不是这样,那么脚本调用之间会发生什么变化?@Nasser脚本确实有输入,这些输入是函数的参数。我使用
PyObject\u CallFunction
调用函数。我提到PyRun_SimpleString的唯一原因是人们不会认为我没有做任何研究。我想这个答案很明显,我看起来像个白痴。这不是我第一次过度思考编程,谢谢你的回答!随时请注意,我对循环中必要时取消分配内存所做的编辑。
for(const auto &numberPair : numberPairs)
{
    PyObject *product = PyObject_CallFunction(pFunction, "ii", numberPair.x, numberPair.y);
    if(product != NULL)
    {
        std::cout << "Product is " << PyLong_AsLong(product) << '\n';
        Py_DECREF(product);
    }
}