外部 C ライブラリを Python にラップするさまざまな方法を再評価しています。私はずっと前にプレーンな Python C API を使用することを選択していました。これは高速で、シンプルで、スタンドアロンであり、私が思っていたとおり、将来も保証されていました。それからPyPy
、CPython API をサポートする予定はないようですが、将来的には興味深い代替手段になる可能性がある . ctypes
は遅かったので、cython
PyPy をサポートするために努力しているように見える に戻りました。
私のライブラリには同じシグネチャを持つ関数がたくさんあるので、C プリプロセッサ マクロを多用して Python モジュールを生成しました。Python言語全体にアクセスできるため、これはcythonでより快適になると思いました。ただし、関数ラッパーのファクトリを作成するのに問題があります。
import cython
from numpy cimport ndarray, double_t
cimport my_c_library
cdef my_c_library.data D
ctypedef double_t DTYPE_t
cdef parse_args(ndarray[DTYPE_t] P, ndarray[DTYPE_t] x, ndarray[DTYPE_t] y):
D.n = P.size
D.m = x.size
D.P = <double*> P.data
D.x = <double*> x.data
D.y = <double*> y.data
def _fun_factory(name):
cpdef fun(ndarray[DTYPE_t] P, ndarray[DTYPE_t] x, ndarray[DTYPE_t] y):
parse_args(P, x, y)
getattr(my_c_library, name)(&D)
return y
return fun
fun1 = _fun_factory('fun1')
fun2 = _fun_factory('fun2')
# ... many more function definitions ...
cpdef
内部_fun_factory
. _ ここで何が問題なのですか?pyx
ファイルは通常の python ファイルと同じだと思っていました。pyx
のような別の python スクリプトから動的にファイルを生成するという明白な方法以外に、これを機能させる方法はありますsetup.py
か?
また、cython が許可しないことにも驚きました。
ctypedef ndarray[double_t, ndim=1] p_t
コードをクリーンアップします。なぜこれが機能しないのですか?
自動C -> cython
翻訳機が存在することは承知していますが、そのようなサードパーティのツールに依存することには消極的です。しかし、プロダクションで使用する準備ができていると思われる場合は、遠慮なく提案してください。