La compilation du code C de Cython échoue avec les visionnements en mémoire saisis

Le code suivant est compilé sans problème dans cython:

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 

Cependant, lorsque j’essaie de comstackr le code C généré, le compilateur gcc s’arrête avec une erreur:

 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); 

Où est l’erreur que je fais? Notez que le même code ne pose aucun problème lorsque j’utilise des types de mémoire standard (par exemple, avec un paramètre double[:] xs dans la fonction f ).

De plus, y a-t-il un moyen de libérer le gil dans la fonction f avec Double[:] ? Si j’essaie cela, je reçois un message d’erreur

 test.pyx:13:10: Cannot access buffer with object dtype without gil 

En regardant le code généré, je vois quelques appels à __Pyx_INCREF et à __Pyx_DECREF , qui ne me semblent toutefois pas nécessaires.

MODIFIER

Après quelques discussions, je peux maintenant trouver des solutions de contournement et pouvoir comstackr le code C: par exemple, utilisez object[:] xs dans la définition de la fonction, puis convertissez ((xs[i])).incr() dans la boucle for. Cependant, ces solutions de contournement introduisent encore plus d’interaction python, ce que j’aimerais éviter.

En termes plus généraux, la question qui se pose est la suivante: existe-t-il un moyen dans Cython de gérer une liste homogène de cdef class (un tampon typé ou similaire), de sorte qu’il n’y ait pas de surcharge python et que la GIL puisse être libérée?

    Veuillez cocher cette rubrique, votre cas lui ressemble probablement: Cython: avoir une séquence de types d’extension comme atsortingbut d’un autre type d’extension avec access aux méthodes cdef

    Veuillez également essayer __pyx_vtab pour __pyx_vtab – les résultats de recherche affichent des questions de personnes ayant le même problème, j’ai vérifié une première et brièvement et regarde qu’une solution existe également: https://groups.google.com/forum/#!topic/cython- utilisateurs / 3tUDIc11Xak