切换控制C++与Python的费用

11 投票
4 回答
1158 浏览
提问于 2025-04-17 09:14

我正在开发一个C++的应用程序,这个程序可以用Python来扩展或脚本化。当然,C++通常比Python快很多,但这是否意味着我应该尽量多执行C++代码,而不是Python代码呢?

我之所以这样问,是因为我不太确定,在C++代码和Python代码之间切换控制时,会不会有性能损失?我应该在每个场合都使用C++代码,还是应该避免在简单任务中调用C++,因为从执行C++代码中获得的速度提升可能会被切换语言的成本抵消掉呢?

编辑:我想澄清一下,我问这个问题并不是为了实际解决某个问题。我纯粹是出于好奇,这对未来是值得考虑的。所以我对其他解决方案不感兴趣,我只是想从技术的角度知道答案。:)

4 个回答

2

保持简单,必要时再调整性能。把解释器嵌入到C++应用程序中的主要原因是为了让你在运行时可以根据需要配置或处理数据,也就是说,你可以在不重新编译C++程序的情况下修改脚本——这就是你决定何时调用解释器的依据。一旦进入某个解释器调用,回到C++的主要原因有:

  • 访问或更新一些不方便作为参数传递的数据(或者通过解释器支持的其他注册方式)
  • 在某些关键处理环节获得更好的性能

对于后者,先尝试用脚本来实现(假设那里的开发同样简单),如果发现速度慢,再找出哪些C++代码可以帮助提升性能。如果性能确实成了问题——作为一个通用的指导原则,在从C++调用解释器或反向调用时:尽量把尽可能多的工作安排好,然后再去调用另一个系统。如果遇到困难,可以回到stackoverflow,提出具体问题和实际代码。

8

我不知道有没有具体的规则,但很多人遵循的一个大致原则是:

  • 先用Python做原型。这种方式写起来更快,而且可能更容易理解和推理。
  • 一旦有了原型,你就可以通过性能分析找到那些运行较慢的部分,然后再用C++来重写它们。
  • 根据你代码的领域,通常慢的部分都是集中在“内循环”这类代码里,所以在Python和这些代码之间切换的次数应该相对较少。
  • 如果你的程序运行得足够快,那就说明你成功避免了过早优化代码,没必要写太多C++。
1

这个成本是存在的,但可以忽略不计。这是因为你可能需要花费不少时间把Python的高级数据类型转换成C++能理解的格式。当然,这就像是从一个C++函数调用另一个C++函数时会有一些额外的开销。以下是一些适合从Python切换到C++的情况:

1. 参数很少的函数

2. 在少量数据上进行大量处理的函数

3. 尽量少调用的函数 - 如果可以的话,尽量合并函数调用

撰写回答