3

在我正在开发的项目中,我一直在将一些 python 函数和类转换为 cython。所以现在我有各种 .pyx 文件和相应的 .py 文件,它们包含基本相同的代码,cython 包括变量类型。但是,有时,cython 会包含对 python 代码的一些小的修改——(1)因为修改后的代码比保持相同的 python 形式更快(但等效)。

一开始我并不认为这种重复的代码会成为问题。此外,我计划定期比较 python 和 cython 实现的输出,以便我可以更快地发现对其中一个或另一个的任何意外修改。问题是我有更多的工作来保持两个实现同步,因为我发现了错误、进行改进等。这让我想知道这是否是使用 cython 的正确方法。

我知道理想情况下你会在 python 中完成你的所有项目,然后如果它很慢,找到热点并对它们进行 cythonize。但是,在我的项目中,我使用 python 作为 matlab 替代品来替代我正在开发的增强现实系统中的交互式原型算法。该系统是实时工作的,所以我经常在早期使用 cython 新算法以获得更高的 fps 并查看它的实时行为。

所以我的问题:

涉及大量 cython 代码的项目是否有重复代码?.pyx 文件和相应的 .py 文件?并让它们保持同步?还是他们只使用 cython 并直接在 cython 中开发新算法?那么就不会有重复的代码。但是,我无法在我最喜欢的 python IDE (wingIDE) 中调试 cython 代码。就此而言,我从来没有设法让 cygdb 在 Windows 7 中工作(在尝试了很长时间之后,我认为它只在 linux 中工作)所以我坚持使用 print 语句调试 cython 代码,这并不理想,而且基本上我放弃了我可以使用 python 和wingIDE 进行的所有交互式开发(类似matlab)。

然后是纯 python 模式http://docs.cython.org/src/tutorial/pure.html我喜欢使用 .pxd 文件来扩充我的 python 代码的想法,这样我就不会有重复代码的问题。我还没有尝试过,但我已经了解了一些限制,所以我不确定它是否足够好。另外,我不知道是否可以使用纯 python 模式从我在上面 (1) 中讨论的 python 代码中集成这些小的修改。这些可以放在 pxd 文件中吗?或者我是否必须有一个 pxy 文件才能进行修改?或者最好忘记修改任何内容。有没有人对纯python模式有很好的经验?

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

4

1 回答 1

3

简短的回答是:不,python 项目不会同时保留 cython 和 python 代码。两者兼顾,负担太大。

以下是我使用 cython 的方式:我首先在 Python 中实现代码。通常,我在小型数据集上进行测试,因此速度不是问题。如果我发现代码太慢,我会尝试在 Python 中寻找优化。如果找不到,我会尝试对代码进行cythonizing。完成此操作后,我将比较 python 实现和 cython 的加速(使用 ipython 的 %timeit 魔术函数)。

事实上,cython 代码比 python 代码调试起来更复杂。但通常,我开始编写 cython 代码,我有一个无错误的算法。此外,回溯包含引发异常的 cython 代码的行号。如果您的代码段错误,您可以尝试使用 gdb 对其进行调试 [1]_

我还没有使用 pxd 文件。

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

于 2013-03-13T17:03:16.013 回答