2016-06-16 4 views
0

で失敗し、次のコードは、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での方法は何ですか?

答えて

1

このトピックを確認してください、あなたの場合は、おそらくそれのようになります。 Cython: have sequence of Extension Types as attribute of another Extension Type with access to cdef methods

__pyx_vtabのためにグーグルで試してみてください - 検索結果は、同様の問題を抱えている人々からの質問を示し、私は最初のものを簡単にチェックしていることに見えますいくつか解決策があります。 https://groups.google.com/forum/#!topic/cython-users/3tUDIc11Xak

+0

ありがとうございます。あなたがリンクした質問は本当に非常に似ていますが、私はそれを見落としました。しかし、答えは提供されておらず、回避策が示唆されています。しかし、この回避策では、Pythonのオーバーヘッドが発生します。また、私はまだcythonが__Pyx_INCREFをコードに入れている理由を理解していないため、これらの構文を高速で並列に使うことはできません。したがって、質問はまだ答えられていません。 –

+0

Googleの提案がうまくいかず、同様の問題について議論しているページがいくつかありますが、私のケースに当てはまる解決策はありません:特に、あなたが言及したページでは、異なるファイルで定義された-childrenクラス。 –

関連する問題