以下代码在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
但是,当我尝试编译生成的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);
我犯的错误在哪里?请注意,当我使用标准内存类型时,相同的代码没有任何问题(例如,在double[:] xs
函数中使用f
参数。)
此外,有没有办法用f
释放Double[:]
函数中的gil?如果我尝试,我收到一条错误消息
test.pyx:13:10: Cannot access buffer with object dtype without gil
查看生成的代码,我看到了几个对__Pyx_INCREF
和__Pyx_DECREF
的调用,但这似乎不需要我。
修改
经过一些讨论,我现在可以找到变通方法并能够编译C代码:例如在函数定义中使用object[:] xs
,然后在for循环中转换(<Double>(xs[i])).incr()
。但是,这些解决方法引入了更多的python交互,这正是我想要避免的。
更一般地说,问题是:在cython中是否有办法处理cdef class
(类型缓冲区或类似的)的同类列表,这样就没有python开销和GIL可以发布吗?
答案 0 :(得分:0)
请检查此主题,您的情况可能类似于: Cython: have sequence of Extension Types as attribute of another Extension Type with access to cdef methods
请同时尝试使用Google搜索__pyx_vtab
- 搜索结果会显示有类似问题的人提出的问题,我先简单检查了一下,看起来也有一些解决方案:
https://groups.google.com/forum/#!topic/cython-users/3tUDIc11Xak