で失敗し、次のコードは、cythonで問題なくコンパイルされます。cythonのCコードのコンパイルが型付きmemoryviews
cdef class Double:
cdef double v
def __init__(self, double v):
self.v = v
cdef double incr(self) nogil:
self.v += 1
return self.v
cdef int f(Double[:] xs):
cdef int i, N
N = xs.shape[0]
for i in range(N):
xs[i].incr()
return 0
私は生成されたCコードをコンパイルしようとすると、しかし、GCCコンパイラはエラーで停止:
test.c: In function '__pyx_f_4test_f':
test.c:1491:55: error: 'PyObject {aka struct _object}' has no member named '__pyx_vtab'
((struct __pyx_vtabstruct_4test_Double *)__pyx_t_3->__pyx_vtab)->incr(__pyx_t_3);
私が行っているエラーはどこですか?標準のメモリタイプ(たとえば、f
関数のdouble[:] xs
パラメータ)を使用すると、同じコードに問題はありません。
また、f
関数内のgilをDouble[:]
で解放する方法はありますか?私はそれをしようとすると、私はエラーメッセージを生成されたコードを見てみると
test.pyx:13:10: Cannot access buffer with object dtype without gil
を取得し、私は、しかし、私には必要ないようです__Pyx_INCREF
と__Pyx_DECREF
への呼び出しのカップルを参照してください。
EDIT
いくつかの議論の後、私は今の回避策を見つけて、Cコードをコンパイルすることができることができます:関数定義でobject[:] xs
を使用たとえば、その後、forループで(<Double>(xs[i])).incr()
をキャスト。しかし、これらの回避策は、私が避けたいと思っている、さらに多くのPythonの相互作用を導入しています。より一般的に言えば
、質問は:がそこにはPythonのオーバーヘッドがなく、GILを解放することができるようにcdef class
の均質リスト(型付きバッファまたは類似)に対処するcythonでの方法は何ですか?
ありがとうございます。あなたがリンクした質問は本当に非常に似ていますが、私はそれを見落としました。しかし、答えは提供されておらず、回避策が示唆されています。しかし、この回避策では、Pythonのオーバーヘッドが発生します。また、私はまだcythonが__Pyx_INCREFをコードに入れている理由を理解していないため、これらの構文を高速で並列に使うことはできません。したがって、質問はまだ答えられていません。 –
Googleの提案がうまくいかず、同様の問題について議論しているページがいくつかありますが、私のケースに当てはまる解決策はありません:特に、あなたが言及したページでは、異なるファイルで定義された-childrenクラス。 –