2

ctypes現在改善しようとしているものを使用して、C ライブラリの周りに薄いラッパーを作成しました。ライブラリadd_datum(*graph,int)にはラップした関数 ( Structureforを含むgraph) があり、正常に実行されます。

問題は、この関数を 200 万回以上呼び出す必要があり、パフォーマンスがひどく低下していることです。add_data(*graph, int[])を繰り返し呼び出すのと同じことを行う短い C 関数を実装しました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クラス定義:

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

これは堅牢でクロスプラットフォームですか? 私が Google/SO で見つけたものから、よりctypes使いやすい C API がないようです。

私が心配しているのはPEP 353のせいだけで、率直に言って、これは私の頭を少し超えました。

4

0 に答える 0