我使用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而感到担忧,坦率地说,这有点过头了。