Ctypes、C扩展和外部库:将Long转换为Void Poin

2024-07-06 23:54:33 发布

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

我用ctypes为C库构建了一个薄型包装器,我现在正在努力改进它。这个库有一个我包装过的add_datum(*graph,int)函数(包括graphStructure),并且运行成功。在

问题是我需要调用这个函数超过200万次,而且性能非常糟糕。我实现了一个短C函数add_data(*graph, int[]),它的作用与对add_datum(*graph, int)的重复调用相同。通过节省一些冗余的C级验证*graph和2M+python函数调用,我大大提高了执行时间。在

我关心的是代码的可移植性,因为我必须将一个由ctypes.addressof返回的Python整数转换为*void。在

以下是相关的代码位(错误检查、删除删除):

int extract_graph(PyObject* pygraph, graph** mygraph) {
  PyObject* ctypes_ptr, graph_obj, addr_obj;
  ctypes_ptr = PyObject_GetAttrString(pygraph, "graph_ptr");
  graph_obj = PyObject_GetAttrString(ctypes_ptr, "contents");
  addr_obj = PyObject_CallFunctionObjArgs(addressof, graph_obj);
  *mygraph = (graph*) PyLong_AsVoidPtr(addr_obj); /* <-------------------------- */

以及python类def:

^{pr2}$

这是健壮的跨平台的吗?从我在Google上找到的结果来看,ctypes似乎没有更友好的C API。在

我之所以担心是因为PEP 353,坦率地说,这有点过头了。在


Tags: 函数代码addobjctypesgraphintaddr