在c++和Python之间切换控制的代价
Price of switching control between C++ and Python
我正在开发一个用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++是一个好主意时,规则是:
有几个参数的函数
对少量数据进行大量处理的函数
尽可能少调用的函数-尽可能合并函数调用
最好的指标应该是为你权衡的东西....
- 使开发、调试和测试更容易(降低开发成本)
- 降低维护成本
- 满足性能要求(提供解决方案)
- 控制允许动态运行c++的并发操作数
- 从控制台中删除最后打印的元素
- 是否可以使用if constexpr删除控制流语句
- 无法在windows控制台中为C++程序提供必要的输入
- 控制到达非空函数clang(-Wreturn-type)的末尾
- 查找 GCD:并非所有控制路径都返回值
- 通过 API 控制 DJI 相机
- 禁止在控制台上记录谷神星
- 是否可以使用一个类来控制 C++ 中另一个类的对象?(阿杜伊诺)
- 如何删除列出的"QGraphicsPathItem"对象以控制进程内存使用情况?
- 我在 C++ 代码中遇到错误警告:控制到达非空函数 [-Wreturn 类型] 的末尾
- C++ Python 模块在 Blender 中崩溃,但在 Python 控制台中不会崩溃
- wx通用目录控制错误"wxTheFileIconsTable was nullptr"
- main() 中的 std::cout 在调试期间不会在调试控制台中打印任何内容
- Cython通过浮点数的最快方式,用于高频控制回路
- 用户控制从 c++ 到 java 脚本的 Webassembly 访问调用
- C ++,如何从控制台中输入的字符串中删除字母?
- 如何从单独的线程控制 SFML 窗口?
- 如何防止 Windows 控制台上的回车键自动滚动
- 在c++和Python之间切换控制的代价