在c++和Python之间切换控制的代价

Price of switching control between C++ and Python

本文关键字:控制 代价 之间 c++ Python      更新时间:2023-10-16

我正在开发一个用Python扩展/可编写脚本的c++应用程序。当然,一般来说,c++比Python快得多,但这是否意味着您应该尽可能多地执行c++代码而不是Python代码呢?

我问这个问题是因为我不确定,在用c++编写的代码和用Python编写的代码之间切换控制是否有性能成本?我是否应该在任何场合都使用c++编写的代码,或者我是否应该避免在简单的任务中调用c++,因为执行c++代码可能获得的任何速度增益都比不上在语言之间切换的成本?

编辑:我应该说清楚,我不是要求这实际上解决一个问题。我纯粹是出于好奇才问这个问题的,而且这个问题值得我们为将来考虑。所以我对替代方案不感兴趣,我只想知道答案,从技术的角度来看。:)

我不知道这有什么具体的规则,但很多人遵循的一般规则是:

    python中的原型。这样写起来更快,而且可能比更容易阅读/推理。一旦你有了一个原型,你现在就可以确定应该用c++编写的慢的部分(通过分析)。
  • 根据代码的领域,慢位通常与'内循环'类型的代码隔离,因此python和此代码之间的切换数量应该相对较小。
  • 如果你的程序足够快,你已经成功地避免了过早地优化你的代码,因为你用c++写了太多的代码。

保持简单并根据需要调整性能。在c++应用程序中嵌入解释器的主要原因是允许运行时配置/数据指定一些处理——也就是说,你可以修改脚本而无需重新编译c++程序——这是你何时调用解释器的指南。在一些解释器调用中,回调到c++的主要原因是:

  • 访问或更新一些数据,这些数据不能合理地作为参数公开给调用(或通过解释器支持的其他注册过程)
  • 在处理的某些关键部分获得更好的性能

对于后者,首先尝试脚本(假设它很容易在那里开发),然后如果它很慢,则确定一些c++代码可能在哪里以及如何提供帮助。如果/当性能确实证明是一个问题时-作为从c++调用解释器或反之亦然的一般指导方针:尝试尽可能多地排列工作,然后调用到另一个系统。如果你卡住了,带着具体的问题和实际的代码回到stackoverflow。

成本存在但可以忽略不计。这是因为将python的高级数据类型转换为与c++兼容的表示可能需要做相当多的工作。当然,这与从一个c++函数调用另一个c++函数的开销类似,有一些开销。当从python切换到c++是一个好主意时,规则是:

有几个参数的函数

对少量数据进行大量处理的函数

尽可能少调用的函数-尽可能合并函数调用

最好的指标应该是为你权衡的东西....

  • 使开发、调试和测试更容易(降低开发成本)
  • 降低维护成本
  • 满足性能要求(提供解决方案)