我正在开发一个项目中将一些python函数和类转换为cython。所以现在我有各种.pyx文件和相应的.py文件,其中包含基本相同的代码,cython包含变量类型。但是,有时候,cython包含一些python代码的小修改 - (1)因为修改后的代码比保持相同的python形式更快(但是相同)。
一开始我并不认为这种双重代码会成为问题。另外,我正在计划定期比较python和cython实现的输出,以便我可以更快地获得对其中一个的任何意外修改。问题是我有更多工作要保持两个实现同步,因为我发现了错误,进行了改进等等。这让我想知道这是否是使用cython的正确方法。
我知道理想情况下你会在python中完成所有项目,然后如果它很慢,找到热点并对它们进行cython化。但是,在我的项目中,我使用python作为matlab的替代品,在我正在开发的增强现实系统中以交互方式原型算法。该系统是实时工作的,所以我经常在早期使用新算法进行cython以获得更高的fps,并了解它的实时行为。
所以我的问题:
涉及大量cython代码的项目是否有重复的代码? .pyx文件和相应的.py文件?并保持同步?或者他们只使用cython并直接在cython中开发新算法?然后不会有重复的代码。但是,我无法在我最喜欢的python IDE(wingIDE)中调试cython代码。就此而言,我从未设法让cygdb在Windows 7中运行(经过一段时间的努力,我认为它只适用于linux)所以我坚持使用print语句调试cython代码,这是不理想的,基本上我放弃了所有的交互式开发(matlab之类)我可以用python和wingIDE做。
然后有纯python模式http://docs.cython.org/src/tutorial/pure.html我喜欢使用.pxd文件来增强我的python代码,然后我不会有重复的代码问题。我还没有尝试过,但我已经读过一些限制,所以我不确定它是否运行良好。另外,我不知道是否使用纯python模式我可以在上面(1)中讨论的python代码中集成这些小修改。这些可以放在一个pxd文件中吗?或者我是否必须有一个pxy文件进行修改?或者更好的忘记修改任何东西。有没有人有纯python模式的好经验?
我不知道是否还有其他更好的方法可以使用cython,所以,如果您知道更好的方式,请告诉我们。
答案 0 :(得分:3)
简短的回答是:不,python项目不保留cython和python代码。保护两者都是太多的负担。
以下是我如何使用cython:我首先在Python中实现代码。通常,我测试小数据集,因此速度不是问题。如果我发现代码太慢,我会尝试在Python中查找优化。如果我找不到任何,我尝试cython化代码。一旦完成,我将在速度提升方面比较python实现和cython实现(使用ipython的%timeit魔术功能)。
实际上,cython代码比python代码更复杂。但通常,我开始编写cython代码,我有一个无bug的算法。此外,回溯包含引发异常的cython代码的行号。如果您的代码段错误,您可以尝试使用gdb来调试它[1] _
我还没有使用pxd文件。