我使用cython的方法正确吗?

3 投票
1 回答
1540 浏览
提问于 2025-04-17 18:58

我最近在把一些Python的函数和类转换成Cython,目的是为了提高性能。现在我有了很多.pyx文件和对应的.py文件,它们的代码基本上是一样的,只不过Cython的版本里给变量加上了类型。不过,有时候Cython的代码会对Python的代码做一些小改动——(1)因为这样改动后的代码运行得更快,但功能上是等价的。

一开始我觉得代码重复没什么大问题。而且,我计划定期比较Python和Cython的输出,这样可以更快发现其中一个的意外修改。问题是,随着我发现bug、进行改进等,我需要花更多的时间来保持这两种实现的一致性。这让我开始怀疑这样使用Cython是否正确。

我知道理想情况下,应该先用Python完成整个项目,如果发现速度慢,再找出关键部分用Cython加速。然而,在我的项目中,我把Python当作Matlab的替代品,用来互动式地原型设计我正在开发的增强现实系统的算法。这个系统是实时运行的,所以我经常会提前用Cython来加速新算法,以提高帧率,看看它在实时情况下的表现。

所以我有几个问题:

涉及大量Cython代码的项目是否会有重复代码?也就是同时存在.pyx文件和对应的.py文件,并保持它们同步?还是说直接只用Cython,直接在Cython中开发新算法?这样就不会有重复代码了。不过,我在我最喜欢的Python IDE(wingIDE)中无法调试Cython代码。说到这一点,我在Windows 7上从来没能让cygdb正常工作(经过长时间的尝试,我觉得它只在Linux上能用),所以我只能通过打印语句来调试Cython代码,这样并不理想,基本上我失去了用Python和wingIDE进行互动式开发(像Matlab那样)的能力。

还有纯Python模式 http://docs.cython.org/src/tutorial/pure.html,我喜欢用.pxd文件来增强我的Python代码,这样就不会有重复代码的问题。我还没尝试过,但我读到了一些限制,所以不确定它是否足够好。此外,我不知道在纯Python模式下,是否能把我上面提到的(1)中的小改动整合进去。这些改动可以放在.pxd文件里吗?还是说我需要为这些修改再创建一个.pxy文件?或者干脆就不修改任何东西。有没有人对纯Python模式有好的经验?

我不知道是否有更好的使用Cython的方法,所以如果你知道更好的方法,请告诉我们。

1 个回答

3

简单来说,Python项目不会同时保留Cython和Python的代码,因为维护两个版本太麻烦了。

我使用Cython的方式是这样的:首先我会用Python写代码。通常我会在小数据集上测试,这样速度不是问题。如果我发现代码运行得太慢,我会尝试在Python中进行优化。如果找不到优化的方法,我就会尝试用Cython来改进代码。完成后,我会用ipython的%timeit功能比较Python和Cython版本的速度。

确实,Cython代码比Python代码更难调试。不过通常在我开始写Cython代码时,我的算法已经没有错误了。而且,当出现错误时,错误信息会告诉你是Cython代码的哪一行出了问题。如果你的代码崩溃了,可以尝试用gdb来调试它。

我还没有使用过pxd文件。

[1]_ http://scipy-lectures.github.com/advanced/debugging/index.html#debugging-segmentation-faults-using-gdb

撰写回答