【问题标题】:Speed - embedding python in c++ or extending python with c++速度 - 在 c++ 中嵌入 python 或使用 c++ 扩展 python
【发布时间】:2012-03-17 01:56:29
【问题描述】:

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

到现在为止,我都是用 python 来做的,但是我该说什么呢:它不是一个 speedster。

现在我正在考虑使用 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 分钟 :))))

【问题讨论】:

  • 你确定延迟是在python代码的执行上吗?通常,如果您正在处理外部数据或数据库,则存在速度瓶颈(千比一)。我会验证它是python代码。那就看看cythonpsyco能不能帮到你!
  • 如果你需要从外部网站获取数据,你的编程语言肯定不会成为瓶颈。我不确定你在这里走的是正确的道路。为什么不坚持使用 Python?编辑:@gahooa 打败了我 :)
  • 脚本在专用服务器以及数据库上运行。唯一真正外部的是需要下载和解析的网站和 Web 服务。下载速度不会提高,但解析时间和整个数据的计算时间一样。希望我理解正确。
  • @DavidTitarenco 网站的部分就像我的程序必须做的 1-2%。 1. 如果有一些新数据可用,我必须下载它,解析它,然后将其放入数据库。 2. 每小时检查新数据可用。所以这不是速度问题。
  • -1 这完全不是问题,原因有两个:1)您的瓶颈几乎肯定不是您描述的用例中的 CPU。 2) 如果将 Python 嵌入 C++ 会导致 Python 代码被解释,那么显然用 C++ 编写瓶颈代码并从 Python 中调用它会更好。

标签: c++ python embedding extending


【解决方案1】:

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

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

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

如果应用程序正在耗尽 CPU,并且大部分时间都花在应用程序上(用户时间),那么可能需要为应用程序使用更有效的技术。

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

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

【讨论】:

  • 很好,我不知道有类似“时间 xxxx”的东西,谢谢 :) 我猜你的测量是正确的。但是用 c++ 重写一些部分不会是一个缺点,也可以帮助我提高我的跨语言技能。而且我还可以测量时间,看看它是否对我有帮助。
  • 如果您可以使用 Mac、Solaris 或 FreeBSD 机器,您可能希望使用 DTrace 进行调查。您可以获得“端到端”,即通过内核、网络驱动程序和文件系统,使用它进行性能测量。您可能还想研究分析 Python 的方法,例如 docs.python.org/library/profile.html
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 我也是这么想的,但我不确定,因为我以前从来没有这样做过:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多