cython C代码编译因类型化的内存视图

时间:2016-06-16 21:52:19

标签: c compiler-errors cython

以下代码在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可以发布吗?

1 个答案:

答案 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