我使用cython的方法正确吗?
我最近在把一些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 个回答
简单来说,Python项目不会同时保留Cython和Python的代码,因为维护两个版本太麻烦了。
我使用Cython的方式是这样的:首先我会用Python写代码。通常我会在小数据集上测试,这样速度不是问题。如果我发现代码运行得太慢,我会尝试在Python中进行优化。如果找不到优化的方法,我就会尝试用Cython来改进代码。完成后,我会用ipython的%timeit功能比较Python和Cython版本的速度。
确实,Cython代码比Python代码更难调试。不过通常在我开始写Cython代码时,我的算法已经没有错误了。而且,当出现错误时,错误信息会告诉你是Cython代码的哪一行出了问题。如果你的代码崩溃了,可以尝试用gdb来调试它。
我还没有使用过pxd文件。