2017-06-22 8 views
0

にギルを削除することはできませんCタイプの拡張ですので、Pythonオブジェクトではないはずですが、この場合はnogilを適用できません。なぜこれが起こっているのか、私はやや無知です。は、私はというエラーを取得していますなぜ私は理解していないC型エクステンション反復

cdef class Fraction: 

    cdef int _numerator 
    cdef int _denominator 
    cdef int numerator 
    cdef int denominator 

    def __cinit__(self, numerator=0, denominator=None, bint _normalize=True): 

     self._numerator = numerator 
     self._denominator = denominator 


@cython.boundscheck(False) 
@cython.wraparound(False) 
cpdef gaussian_inverse_cy(): 

    cdef int a = 1, b = 2, i 

    with nogil: 
     for i in prange(10000): 
      Fraction(a,b) 
+1

実際にはPythonオブジェクトです。 cdefクラスを使用すると、**組み込みの新しいPythonタイプ** http://docs.cython.org/ja/latest/src/userguide/extension_types.html#introductionを作成できます。これは、gilなしでは作成/操作できません。 – oz1

+0

これを小さな 'with gil:'ブロックに入れることができるかもしれません。明らかに、この場合はループ全体になりますが、実際の例では、ループのほんの一部である可能性があります。私はあなたがGILなしで 'cdef'属性にアクセスすることができなければならないと思います。 – DavidW

+0

@MLhackerこれが役立つかどうかを確認してください:https://stackoverflow.com/a/21135087/6037118 – Matt

答えて

0

cdef classは、新しいPython拡張クラスを定義します。それらから作成されたオブジェクトは、GILの作成または操作が必要なPythonオブジェクトです。

GILなしで使用でき、逆にPythonで公開されないC構造体が必要な場合は、構造体を使用してそれを拡張クラスにマップできます。例えば

from libc.stdlib cimport malloc, free 
from cython.parallel cimport prange 

ctypedef struct _Fraction: 
    int numerator 
    int denominator 

cdef _Fraction * create_fraction(int numerator, int denominator) nogil: 
    # Example, needs error checking, freeing, etc 
    _fraction = <_Fraction *>malloc(sizeof(_Fraction)) 
    _fraction.numerator = numerator 
    _fraction.denominator = denominator 
    return _fraction 

cpdef gaussian_inverse_cy(): 
    cdef int a = 1, b = 2, i 
    with nogil: 
     for i in prange(10000): 
      my_fract = create_fraction(a,b) 
      # <do something with my_fract> 

上記のコンパイルと明らかに何もPythonオブジェクトとして返されていないものの、細かい動作します。 Pythonのに分数構造を露出させ

あなたは例えば、_Fraction *メンバーを使用して、それのための拡張クラスを作成します。

CDEFクラス分率: CDEFの_Fraction * _fraction <を...>

そして、 _fractionを、オブジェクトの作成後に_Fraction構造体へのCポインタに割り当てます。

関連する問題