我用ctypes
为C库构建了一个薄型包装器,我现在正在努力改进它。这个库有一个我包装过的add_datum(*graph,int)
函数(包括graph
的Structure
),并且运行成功。在
问题是我需要调用这个函数超过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,坦率地说,这有点过头了。在
目前没有回答
相关问题 更多 >
编程相关推荐