在我的 Python 程序的 C 扩展中,我试图通过将主 C 函数的两个输入(称为数百万次)设置为全局变量来提高性能,因为它们不会经常更改,所以我不不必继续使用 lambda 包装器从 Python 将它们提供给 C 函数(这会浪费大量时间)。我的代码看起来像这样。首先,我在文件顶部声明全局变量:
unsigned char* splitArray;
PyObject* wordCmp;
然后使用 Python API 函数来设置它们:
static PyObject* py_set_globals(PyObject *self, PyObject *args)
{
free(wordCmp);
free(splitArray);
char* splitChars;
PyObject* wordC;
if (!PyArg_ParseTuple(args, "sO", &splitChars, &wordC))
return NULL;
wordCmp = (PyObject*)malloc(sizeof(PyObject));
memcpy(wordCmp, wordC, sizeof(PyObject));
splitArray = splitchars_to_mapping(splitChars);
return Py_BuildValue("");
}
在这种情况下,splitArray 被分配给一个 128 个字符的数组,该数组在函数 splitchars_to_mapping 中进行了 malloc'ed,wordCmp 是一个传递给 C 的 Python 函数对象。无论如何,据我所知,char* splitArray 有效作为一个全局变量很好,但是当我后来尝试使用 PyEval_CallObject 调用 wordCmp 时,Python/C 崩溃了。所以我有两个问题:
- 当我尝试在函数开头释放未初始化的指针 wordCmp 和 splitArray 时,为什么 C 不会立即崩溃?
- 当我将 wordCmp 正确存储在堆上并将对它的引用保存为全局时,为什么我以后无法调用 wordCmp?