在Python中使用C/C++进行复杂计算(还包括MySQL)

3 投票
4 回答
1422 浏览
提问于 2025-04-18 05:31

我正在我的Python网页应用中实现一个算法,这个算法涉及一些(可能会很大)聚类和矩阵计算。我发现Python可以使用C/C++的库,觉得利用这个可以加快速度,可能是个好主意。

首先:有没有什么原因让我不要这样做,或者在做这个的时候有什么需要注意的地方?

其次:我对把C和MySQL连接起来(因为我需要从那里获取数据进行计算)有些犹豫。这种犹豫有道理吗?

4 个回答

-2

是的,我们可以通过创建表格来存储一些操作或特定变量的值,比如圆周率π、自然对数的底数e、正弦值等。然后用Python编写程序,并给出必要的指令来进行数学运算。通过使用MySQL连接器,我们可以在这些操作中访问到特定的变量。

1

这不是你期待的答案,但我走过这条路,建议你遵循KISS原则:

  • 首先要让它以最简单的方式运行起来。
  • 然后再考虑如何提高速度或让设计变得复杂。

还有很多其他说法,比如“除非资源无限,否则不要去解决假设的问题”。

1

现在,Cython对C++的支持比以前好多了。你可以在Cython中无缝使用大部分标准库。在极端情况下,速度提升可以达到500倍。

我的经验是,最好让Cython的代码保持简单,把所有参数都传给C++。直接调试C++会容易得多,而且语法也更容易理解。维护一个同时用三种不同语言的代码库真是让人头疼。

使用C++和Cython时,你需要花点时间考虑内存管理的问题。也就是说,通常在C++中不分配内存是最安全的,而是在Python或Cython中准备好内存(可以使用array.arraynumpy.array)。另外,你也可以在Cython中封装一个C++对象,并提供一个释放内存的函数。这样做意味着你的应用程序会比只用Python或C++编写的更脆弱,因为你放弃了RAII(资源获取即初始化)和垃圾回收。

另一方面,你的Python代码应该能一行一行地转换成现代C++。这提醒你在新的C++代码中不要使用过时的newdelete等,而是通过保持高层次的抽象来让代码更快更简洁。

还要记得重新审视你最初算法选择背后的假设。对Python来说合理的做法,可能在C++中就不合适。

最后,Python让一切变得简单、干净,而且调试速度比C++快得多。但在很多方面,C++鼓励更强大的抽象和更好的关注点分离。

当你同时使用Python、Cython和C++编程时,慢慢会感觉像是把两种方法的糟糕部分都结合在了一起。或许值得考虑完全用C++重写。你可以保留Python的测试框架,并把原来的设计作为原型或测试平台。

1

利用现有的工具和库。

对于矩阵运算,使用numpy和scipy可以提供和Matlab差不多的功能。如果你学会了如何用这些模块写出规范的代码,那么在这些模块内部的循环就会在C或FORTRAN的实现中运行,这样大部分任务就能在Python的灵活性和C的性能之间取得平衡。你可能还会对numexpr感兴趣,它可以进一步加速numpy/scipy的表达式,有时候还能实现并行计算。

如果你必须在Python中编写计算密集型的内部循环,先好好想想。也许你可以把问题重新表述一下,让它更适合用numpy/scipy来解决。或者,你可以利用Python中的数据结构,想出一个更好的算法,而不是仅仅追求同一个算法的更快实现。如果这些都不行,还有Cython,它使用一种限制性的Python子集来编译成机器代码。

只有在最后的手段下,并且在分析后找出最严重的瓶颈时,才应该考虑用C/C++编写扩展模块。因为还有很多更简单的方法可以满足大多数性能需求,而数值和数学代码的领域已经有很好的现成库支持。

撰写回答