ctypes
現在改善しようとしているものを使用して、C ライブラリの周りに薄いラッパーを作成しました。ライブラリadd_datum(*graph,int)
にはラップした関数 ( Structure
forを含む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のせいだけで、率直に言って、これは私の頭を少し超えました。