使用C / C ++在Python中进行大量计算(也是MySQL)

时间:2014-05-06 10:04:17

标签: python c++ mysql c

我在我的Python Web应用程序中实现了一个算法,它包括做一些(可能的)大型聚类和矩阵计算。我已经看到Python可以使用C / C ++库,并认为利用它来加快速度可能是一个好主意。

第一:在这样做的时候,有什么理由没有,或者我应该记住什么?

第二:我不愿意将C连接到MySQL(在那里我会得到数据计算)。这有什么理由吗?

3 个答案:

答案 0 :(得分:1)

不是你预期的答案,但我一直走在那条路上,并建议KISS:

  • 首先让它以最简单的方式使用
  • 只是考虑以后加快速度/使设计复杂化。

还有很多其他方法可以说明这一点,例如“不解决假设问题,除非资源无限制”。

答案 1 :(得分:1)

使用生态系统。

对于矩阵,使用numpy和scipy可以提供与Matlab等工具大致相同的功能范围。如果您学习使用这些模块编写惯用代码,则内部循环可以在模块的C或FORTRAN实现中进行,从而为大多数任务产生类似C的整体性能和Python表现力。您可能也对numexpr感兴趣,它可以进一步加速并在某些情况下并行化numpy / scipy表达式。

如果您必须在Python中编写计算密集型内部循环,请首先仔细考虑它。也许你可以用更适合numpy / scipy的方式重新表述问题。或者,也许您可​​以使用Python中提供的数据结构来提供更好的算法,而不是更快地实现相同的算法。如果没有,那就是Cython,它使用Python的受限子集编译成机器代码。

仅作为最后的手段,并且在分析以确定绝对最严重的瓶颈之后,您是否应该考虑使用C / C ++编写扩展模块。有很多简单的方法可以满足绝大多数性能要求,而数字/数学代码是一个具有非常好的现有库支持的领域。

答案 2 :(得分:1)

对c ++的cython支持比它好得多。您可以无缝地使用cython中的大多数标准库。在极端情况下,最高可达500倍的加速比。

我的经验是,最好保持cython代码非常精简,并将所有参数转发给c ++。直接调试c ++要容易得多,并且可以更好地理解语法。必须以三种不同的语言不必要地维护代码库是一件痛苦的事。

使用c ++ / cython意味着您必须花一点时间考虑所有权问题。即最好不要在c ++中分配任何内容,而是在python / cython中准备内存。 (使用array.arraynumpy.array)。或者,创建一个包含在cython中的c ++对象,该对象具有释放功能。所有这些意味着您的应用程序将比仅使用python或c ++编写时更脆弱:您放弃了RAII / gc。

另一方面,你的python代码应该将line for line转换为现代c ++。因此,这提醒您不要在新的c ++代码中使用旧式newdelete等,而是通过将抽象保持在较高水平来使事情快速而清晰。

还要记住重新检查原始算法选择背后的假设。对于c ++而言,什么是合理的可能是愚蠢的。

最后,python使得一切都比c ++更简单,更清晰,调试更快。但在许多方面,c ++鼓励更强大的抽象和更好的关注点分离。

当你使用python和cython和c ++进行编程时,它会逐渐感觉到采取两种方法的更糟糕的部分。可能值得咬紧牙关并完全用c ++重写。您可以保留python测试工具并将原始设计用作原型/测试平台。