在Python程序的一个C扩展中,我试图通过将主C函数(被调用数百万次)的两个输入设置为全局变量来提高性能,因为它们不经常更改,所以我不必一直使用lambda包装器从Python向C函数提供它们(这会浪费大量的时间)。我的代码是这样的。首先,我在文件顶部声明全局变量:
unsigned char* splitArray;
PyObject* wordCmp;
然后使用Python API函数设置它们:
^{pr2}$在本例中,splitArray被分配给一个128个字符的数组,这个数组在splitchars_to_映射中被malloc'd,而wordCmp是一个传递给C的Python函数对象。无论如何,据我所知,char*splitArray作为一个全局变量工作得很好,但是当我后来尝试使用PyEval_CallObject调用wordCmp时,Python/C崩溃了。所以我有两个问题:
至于第一个问题,为什么释放未初始化的全局变量时它不会崩溃,这是因为当程序加载(guaranteed by the standard)时,全局(和静态)变量被初始化为}时,它什么都不做。在
zero
,而当你用NULL
(或零)调用{来自man free(1):
编辑: 你的第二个问题与你试图复制
PyObject
有关,你不应该这样做,因为PyObject
结构可能包含指针,而且你不能进行deep复制,因为你没有访问该结构的权限,但是你应该增加引用计数并保留引用以备以后使用,请注意,当您使用O
时,引用计数是从docs递增的:所以你应该自己增加引用,看这个example
相关问题 更多 >
编程相关推荐