2013-03-13 39 views
3

我一直在转换为cython一些python函数和我正在开发的一个项目中的类。所以现在我有各种.pyx文件和相应的.py文件,它们包含基本相同的代码,而cython文件包括变量类型。但是,有时候,cython会包含一些python代码的小修改 - (1),因为修改后的代码比保留相同的python表单更快(但是相当于)。我是否以正确的方式使用了cython?

在开始时,我并不认为这种代码的重复性会成为问题。另外,我打算定期比较python和cython实现的输出结果,以便我能够更快地对任何一个或另一个进行无意的修改。问题是我有更多的工作来保持两个实现同步,因为我发现错误,进行改进等。这让我想知道这是使用cython的正确方式。

我知道,理想情况下,你会做所有你的项目在Python中,然后如果它很慢,找到热点和cythonize这些。然而,在我的项目中,我使用python作为matlab替代品,以便在我正在开发的增强现实系统中交互式地对算法进行原型设计。该系统实时工作,所以我通常会尽早对新算法进行细化以获得更高的fps,并了解它的实时表现。

所以我的问题:这涉及到很多用Cython代码

待办事项项目重复的代码? .pyx文件和相应的.py文件?并保持同步?或者他们只使用cython并直接在cython中开发新的算法?那么就不会有重复的代码。但是,我无法在我最喜欢的python IDE(wingIDE)中调试cython代码。对于这个问题,我从来没有设法让cygdb在Windows 7中工作(经过很长一段时间,我认为它只能在linux下工作),所以我坚持用打印语句调试cython代码,这并不理想,基本上我放松了我可以用python和wingIDE做的所有交互式开发(matlab like)。

然后是纯python模式http://docs.cython.org/src/tutorial/pure.html我喜欢使用.pxd文件来扩充我的python代码,然后我不会有重复的代码问题。我还没有尝试过,但我已经阅读了一些限制,所以我不确定它是否运行良好。另外,我不知道如果使用纯python模式,我可以将上面(1)中提到的python代码中的这些小修改集成到一起。这些可以放在一个pxd文件中吗?或者我会不得不有一个pxy文件的修改?或者更好地忘记修改任何东西。有没有人有纯Python模式的良好体验?

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

+0

我不明白:你为什么“失去了所有的互动发展”?当你使用'cpdef'函数时,你可以在ipython中使用它们......你可以创建一个小的'.pyx'文件来测试代码片段......你错过了什么?只是调试器? – 2013-03-14 12:08:42

+0

是的。当我的意思是“交互式开发”时,我的意思是编写代码并在停止在断点时对其进行测试,并访问所有堆栈帧。 WingIDE调试器允许这样做,而且这是我在python世界中发现的最接近我在matlab中开发时所发现的。我试过ipython,但我无法模仿这种类型的devloping与它。 – martinako 2013-03-14 13:18:53

+0

至少有一个维护Python和Cython版本的有效参数:测试。 Python中的简单实现可用于验证Cython版本的结果,以及小问题实例。 – 2015-07-11 02:34:45

回答

3

简短的回答是:不,python项目不保留cython和python代码。保持两者的负担过重。

以下是我如何使用cython:我首先在Python中实现代码。通常,我测试小数据集,所以速度不是问题。如果我看到代码太慢,我尝试在Python中找到优化。如果我找不到任何东西,我尝试对代码进行集成。一旦完成,我将比较python实现和cython之间的加速比(ipython的%timeit魔术函数)。

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

我还没有使用pxd文件。

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

+0

感谢您的回答。我认为只有cython文件会成为一个问题,因为我可能会在每次尝试子系统的新技术时更改该代码。然后我需要再次将它转换回python进行调试。在cython中调试新代码会导致为什么我使用python来做我的研究,而不是直接在C++中进行。我使用数据集来测试算法,但我也希望看到他们正在使用实时视频(因为我正在开发交互式系统)。 – martinako 2013-03-14 11:39:40

+0

@NelleV:从统计学角度看,任何一段代码都会留下残差,不管是Python还是Cython。信任Python实现并不意味着从它派生的Cython版本的正确性(除非Cython版本是相同的,即纯Python)。 – 2015-07-11 02:31:18

+0

@martinako:直接编写Cython是过早的优化,除非不可能为Python中的特定字段执行任何有意义的开发。实验应该是用Python开发的,只有选定的,已经建立完善的核心部分被推到更低的层次。分析器可以帮助确定哪些部分。 – 2015-07-11 02:33:51

相关问题