1

我有一些大型 mysql 数据库,其中包含用于计算的数据和一些我需要从外部网站获取数据的部分。

直到现在我都使用 python 来完成所有的事情,但我该说什么呢:它不是一个极速者。

现在我正在考虑使用 Boost::Python 和 Python C API 将 Python 与 C++ 混合。

我现在的问题是:获得一些速度的更好方法是什么。我应该用一些 c++ 代码扩展 python 还是将 python 代码嵌入到 c++ 程序中?

我肯定会在计算部分使用 C++ 代码来确保速度有所提高,我认为在 C 应用程序中调用 Python 解释器不会更好,因为 Python 解释器将一直运行。而且我必须包装诸如 mysqldb 或 urllib3 之类的 python 库,以便有一种在 c++ 中工作的好方法。

那么,您认为更好的方法是什么:扩展还是嵌入?(我喜欢 python 语言,但我也熟悉 c++ 并尊重它的速度)

更新:所以我将一些部分从 python 切换到 c++ 并在我的 c 模块中使用了多线程(真正的一个),我的程序现在需要而不是 7 小时 30 分钟 :))))

4

2 回答 2

4

原则上,我同意前两个答案。来自磁盘或通过网络连接的任何内容都可能是比应用程序更大的瓶颈。

过去 50 年的所有研究表明,人们对系统性能问题的直觉往往不准确。所以恕我直言,你真的需要收集一些证据,通过测量实际发生的事情,然后根据这些证据选择一个解决方案。

要尝试确认导致性能下降的原因,请测量应用程序的系统和用户时间(例如time python prog.py),并测量机器上的负载。

如果应用程序正在最大限度地使用 CPU,并且大部分时间都花在应用程序(用户时间)上,那么可能会有一个案例为应用程序使用更有效的技术。

但是如果 CPU 没有达到最大值,或者应用程序将大部分时间花在系统中(系统时间),而不是在应用程序中(用户时间),那么更改应用程序编程技术不太可能有显着帮助。(这是阿姆达尔定律的一个例子http://en.wikipedia.org/wiki/Amdahl%27s_law

您可能还需要测量数据库服务器的性能,可能还需要测量网络连接,以确定瓶颈的来源,但从最简单的部分开始。

于 2012-03-17T02:16:18.053 回答
2

在我看来,在你的情况下,将 Python 嵌入 C++ 是没有意义的,而反过来可能是有益的。

在大多数程序中,性能问题是非常局部的,这意味着您应该只在有意义的地方用 C++ 重写有问题的代码,剩下的交给 Python。

这为您提供了两全其美的优势:C++ 在您需要的地方的速度,Python 在其他地方的易用性和灵活性。同样很棒的是,您可以逐步执行此过程,将慢速代码路径替换为 by,使您始终使整个应用程序处于可用(和可测试!)状态。

反过来是没有意义的:你必须重写几乎所有的代码,牺牲 Python 结构的灵活性。

尽管如此,一如既往地谈论性能,在采取措施之前:如果您的瓶颈不是 CPU/内存限制,那么切换到 C++ 不太可能产生太多优势。

于 2012-03-17T02:02:58.843 回答