最近使用cython做了几个c++ library的wrapper,觉得cython也许没有想象中的那么好,不说bug,只说功能短板
1. c++ struct嵌套enum的支持,比如:
struct EL_TYPE {
enum {A, B, C};
};
没法简单地封装成EL_TYPE.A这样子,只能先搞个cdef class,然后实例化去模仿,当enum很长的时候写起来很别扭,因为申明写一长串,初始化写一长串,比较难看
2. cdef class中的public/readonly变量让人两难,不这么写的话只能cython内部使用,写了的话这块的性能福利又没了
3. numpy的封装(.pxd)比较初级,编译期只包含了numpy的很少一部分(或者直接暴露numpy c api),比如PyArray_NewFromDesc这个方法的核心PyArray_Descr,完全没有封装,当需要自定义Descr时,只能按numpy的方法一个field一个field的去填
4. cython array有点坑,作为一个理应的c实现,在构造时调用了蛮多的python方法,导致这玩意的初始化性能比python array要差一个数量级,当应用中的array构造次数比较多时,这块会成为瓶颈
5. 对c++ std::vector的支持,反正都是contiguous内存了,可以映射到cython array, python array或者numpy ndarray啊
6. 对c++ side 复杂数据结构的支持,几乎就是用cython把c++部分重写一遍。。。
7. 文档。。。比较散,有user guide,有wiki,还有很多技巧性方法只能google。。。比如我就被numpy的PyArray_SimpleNewFromData方法坑过,data指针传给这个函数但numpy不负责释放,为保证ndarray和data生命周期一致要怎么弄。。。结果在<>里找到一个方法,类似于c++的智能指针,把data的引用给一个cdef class,在__dealloc__里释放它,ndarray可以set_array_base到这个cdef class ...