2

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

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

我担心的是代码的可移植性,因为我必须将由 . 返回的 Python 整数ctypes.addressof转换为*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 类定义:

class PyGraph(object):
    def __init__(self):
        self.graph_ptr = ctypes.pointer(c_Graph())

这是健壮和跨平台的吗?从我在 Google/SO 上找到的内容来看,它似乎ctypes没有更友好的 C API。

我只是担心PEP 353,坦率地说,这让我有点过头了。

4

0 回答 0