在Python(也包括MySQL)中使用C/ c++进行大量计算
Using C/C++ for heavy calculations in Python (Also MySQL)
我正在我的Python web应用程序中实现一个算法,它包括做一些(可能)大型聚类和矩阵计算。我已经看到Python可以使用C/c++库,并认为利用它来加快速度可能是一个好主意。
第一:有什么理由不这样做,或者在做这件事的时候我应该记住什么?
第二:我有些不情愿将C连接到MySQL(在那里我将获得计算数据)。这在某种程度上合理吗?
利用生态系统。
对于矩阵,使用numpy和scipy可以提供与Matlab等工具大致相同的功能范围。如果您学会使用这些模块编写习惯代码,则内部循环可以在模块的C或FORTRAN实现中进行,从而在大多数任务中获得与C类似的总体性能和Python表达能力。您可能还对numexpr感兴趣,它可以进一步加速并在某些情况下并行化numpy/scipy表达式。
如果必须在Python中编写计算密集型的内循环,请先认真考虑一下。也许你可以用一种更适合numpy/scipy的方式来重新表述这个问题。或者,也许您可以使用Python中可用的数据结构来提出更好的算法,而不是更快地实现相同的算法。如果没有,还有Cython,它使用Python的一个受限制的子集来编译为机器码。
只有作为最后的手段,并且在分析确定绝对最严重的瓶颈之后,才应该考虑用C/c++编写扩展模块。有很多更简单的方法来满足绝大多数的性能需求,而数字/数学代码是一个拥有非常好的现有库支持的领域。
不是你期望的答案,但我一直在这条路上,并建议KISS:
- 首先让它以最简单的方式工作。
- 只考虑以后加快速度/使设计复杂化。
还有很多其他的表达方式,比如"不解决假设的问题,除非资源是无限的"。
cython对c++的支持比以前好多了。您可以无缝地使用cython中的大多数标准库。在最极端的情况下,加速可达500倍。
我的经验是最好保持cython代码极其精简,并将所有参数转发给c++。直接调试c++要容易得多,语法也更容易理解。必须用三种不同的语言维护不必要的代码库是一种痛苦。
使用c++/cython意味着你必须花一点时间考虑所有权问题。也就是说,最安全的做法是不要在c++中分配任何东西,而是在python/cython中准备内存。(使用array.array
或numpy.array
)。或者,创建一个用cython封装的c++对象,该对象具有释放函数。所有这些都意味着您的应用程序将比仅用python或c++编写的应用程序更加脆弱:您正在放弃RAII/gc。
另一方面,你的python代码应该逐行转换成现代c++。因此,这提醒你不要在新的c++代码中使用老式的new
或delete
等,而是通过保持高层次的抽象来使事情变得快速和干净。
也要记住重新检查你最初的算法选择背后的假设。对于python来说是合理的,对于c++来说可能是愚蠢的。
最后,python使一切都比c++更简单、更干净、更容易调试。但是在许多方面,c++鼓励更强大的抽象和更好的关注点分离。
当你用python、cython和c++编程时,你会慢慢觉得这两种方法都有缺点。也许值得咬紧牙关,用c++完全重写。您可以保留python测试工具,并使用原始设计作为原型/测试平台。
是的,我们可以通过创建表来存储操作或某些变量的值,如PI, e, sin等的值。用python编写程序,并给出必要的数学运算命令。通过使用mysql连接器,我们可以访问操作中的某些变量。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 计算缩放多边形的比例,得到给定的多边形面积
- 在C++中如何在没有pow的情况下进行基础计算
- 计算平均值,不包括上次得分
- 如何计算多映射中重复对的数量