python转cython_说说cython的缺点

本文分享了使用Cython进行C++库封装的经验,指出了包括C++枚举支持不足、公共变量性能折衷、NumPy封装局限性等问题,并探讨了Cython在处理复杂数据结构方面的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近使用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 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值