Cython中cppclass使用咨询:编写C++文件extern还是直接定义?
Cython自定义带运算符重载的struct实现疑问
背景
我有大量Python代码需要优化,部分逻辑通过Cython可实现显著提速。为降低代码迁移难度,希望自定义的struct能支持==和+运算符。需说明:我并非对接已有C代码,而是想借助C struct创建其数组,同时保留构造函数、运算符等特性。
核心疑问:运算符重载的实现方式
除了使用extern引入C++代码外,是否有其他方式在Cython中直接定义运算符重载?例如我尝试编写了以下Cython代码:
cdef cppclass Foo: int bar Foo(int) bint operator==(Foo)
但不清楚该如何实现==运算符的具体逻辑?
还是必须先编写C++代码,再通过extern引入到Cython中?这种方式略显繁琐,示例如下:
foo.cpp
struct Foo{ int bar; Foo(int b){bar = b;}; bool operator == (Foo &other){ if (bar == other.bar){ return true; } else { return false; }; }; };
对应的Cython extern声明:
cdef extern from 'foo.cpp': cdef cppclass Foo: int bar Foo(int) bint operator==(Foo)
我觉得只为了引入到Cython而编写C代码有些多余,但如果Cython对C struct的支持不足,这会不会是最优选择?想了解相关最佳实践。
关于cdef类的顾虑
我也曾考虑使用cdef类,但认为存在以下问题:
- 运算符重载会是较慢的Python层面操作
- 无法定义cdef类的数组
若我的上述认知有误,请予以纠正。
C++代码纠错请求
我对C并不熟悉,上述C代码若存在语法或语义错误(尤其是逗号、括号、分号这类细节问题),请指出。
内容的提问来源于stack exchange,提问作者Todd Sierens
相关产品推荐
相关产品推荐

