使用Python/C接口代替Cython有什么好处吗?

2024-09-27 07:30:38 发布

您现在位置:Python中文网/ 问答频道 /正文

< P>我想用Prthon和Labac写一些C或C++模块来扩展Python和NoMpy.我还希望能够将代码分发为独立的C/C++库。我希望这个库同时使用单精度浮点和双精度浮点。我将要写的一些函数的例子是求解线性系统的共轭梯度法或加速一阶法。一些函数需要调用C/C++代码中的Python函数。

在对Python/C API和Numpy/capi进行了一些研究之后,我发现很多人提倡使用Cython(参见this questionthis one)。我不是Cython的专家,但似乎对于some cases,您仍然需要使用Numpy/C API并知道它是如何工作的。考虑到我对Python/C API已经(有些小)了解,而对Cython一无所知,我想知道继续使用Python/capi是否有意义,以及使用这个API是否比Cython有一些优势。在未来,我肯定会开发一些不涉及数值计算的东西,所以这个问题不仅仅是关于numpy。我喜欢Python/C API的一点是,我学到了一些关于Python解释器工作原理的知识。

谢谢。


Tags: 模块函数代码numpyapi精度thiscython
3条回答

首先,你的问题有一点我不明白:

[...] also want to be able to distribute the code as standalone C/C++ libraries. [...] Some functions will need to call a Python function from the C/C++ code.

怎么会这样?

接下来,关于您的实际问题,直接使用Python/C API肯定有一些好处:

  • 最有可能的是,比起编写Cython代码,您更熟悉编写C代码。

  • 用C语言编写代码可以提供最大的控制能力。要从Cython代码获得与等效C代码相同的性能,您必须非常小心。您不仅需要确保声明所有变量的类型,还需要充分设置一些标志——只有一个例子是bounds checking。你需要深入了解Cython是如何工作的才能获得最好的表现。

  • Cython代码依赖于Python。在Cython中编写也应该作为独立C库分发的代码似乎不是一个好主意

Python/C API的主要缺点是,如果在内部循环中使用它,它可能会非常慢。我看到调用Python函数调用一个等价的C++函数需要80-160x的点击。

如果这不影响您的代码,那么您可以使用Python编写一些代码块,访问Python库,支持直接使用Python编写的回调。这也意味着您可以在不重新编译的情况下进行一些更改,从而简化原型设计。

现在的“最佳答案”听起来有点像我耳边的FUD。首先,普通的开发人员用C编写的代码比NumPy+Cython给你的代码要快,这一点并不明显。恰恰相反,在Python环境中正确运行所需的C代码所需的时间通常要花在用Cython编写一个快速原型、对它进行基准测试、优化它、以更快的方式重写它、再次对它进行基准测试上,然后再决定其中是否有真正需要用手工调试的C语言重写2%的代码并从Cython代码调用它,可能会提高5-10%的性能,也可能不会。

我正在用Cython编写一个库,它目前有大约18K行Cython代码,可以翻译成将近200K行C代码。我曾经通过在正确的位置注入大约20行手动调整的C代码,使一些非常重要的内部基级函数的速度提高了近25%。我花了几个小时重写并优化了这个小部分。与我当初不用C语言编写(并且必须维护)库所节省的大量时间相比,这真的是微不足道。

即使你比Cython更了解C,如果你了解PythonC,你也会很快学会Cython,无论在什么情况下,这都是值得投资的,尤其是当你学习数字的时候。80-95%的代码将从用高级语言编写中受益匪浅,因此您可以放心地将节省的一半时间投入到编写代码的速度上,就像您现在用低级语言编写代码一样。

,你想“把代码作为独立的C/C++库分发”是一个很好的理由,坚持C++。Cython总是依赖于CPython,这是一个相当依赖性的东西。但是,使用普通C/C++(除了Python接口)将不允许你利用NoMPy,因为这也依赖于CPython。所以,像往常一样,用C语言写东西的时候,你必须先做大量的基础工作,然后才能使用实际的功能。在开始这项工作之前,你应该认真考虑一下。

相关问题 更多 >

    热门问题