Ctypes,C扩展和外部库:Cast Long to Void Pointer

时间:2013-04-21 01:07:48

标签: python casting ctypes void-pointers

我使用ctypes围绕C库构建了一个瘦包装器,我现在正在尝试改进它。该库具有我已包装的add_datum(*graph,int)函数(包括Structure的{​​{1}}),并且它已成功运行。

问题是我需要将此功能调用超过200万次,并且性能非常糟糕。我实现了一个简短的C函数graph,它与重复调用add_data(*graph, int[])的效果相同。通过保存add_datum(*graph, int)和2M + python函数调用的冗余C级验证,我大大缩短了执行时间。

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

以下是代码的相关位(错误检查,剥离剥离):

*void

python类def:

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); /* <-------------------------- */

这是强大的跨平台吗?从我在Google / SO上找到的内容看来,class PyGraph(object): def __init__(self): self.graph_ptr = ctypes.pointer(c_Graph()) 没有更友好的C API。

我只是因为PEP 353而感到担忧,坦率地说,这有点过头了。

0 个答案:

没有答案