实用观点:为啥要在 C++ 中使用 Python?

Posted

技术标签:

【中文标题】实用观点:为啥要在 C++ 中使用 Python?【英文标题】:Practical point of view: Why would I want to use Python with C++?实用观点:为什么要在 C++ 中使用 Python? 【发布时间】:2009-07-25 07:14:52 【问题描述】:

我已经看到一些 Python 与 c++ 一起使用的示例,我试图理解为什么有人想要这样做。从 Python 等外部语言调用 C++ 代码有什么好处?

我很欣赏一个简单的例子 - Boost::Python 就可以了

【问题讨论】:

【参考方案1】:

这取决于你的观点:

从 python 应用程序调用 C++ 代码

当性能成为问题时,您通常希望这样做。像 python 这样的高度动态语言通常比 C++ 等本地代码慢一些。 C++ 的“特性”(例如手动内存管理)允许开发非常快速的库,然后可以从 python 调用这些库以获得性能。

另一个原因是由于 windows 和 *nix 上的大多数库都是用 C 或 C++ 编写的,拥有这个现有的代码库是一个巨大的优势。

从 C++ 应用程序调用 python 代码

复杂的应用程序有时需要能够定义额外的能力。在已编译的应用程序中添加行为很麻烦,需要原始源代码并且很耗时。因此,为了使应用程序更加灵活和可定制,嵌入脚本语言(如 python)通常具有战略意义。

举个例子:我认为如果您希望样本有任何帮助,您需要澄清一下您感兴趣的内容。 boost 手册提供了一个简单的hello world sample,如果您正在寻找它。

【讨论】:

【参考方案2】:

通常,您会从 python 调用 C++ 以使用现有库或其他功能。经常有人写了一组函数让你的生活更轻松,调用编译好的 C 代码比用 python 重写库更容易。

另一个原因是出于性能目的。通常,一个完全脚本化的程序的特定功能是用 C 等预编译语言编写的,因为它们需要很长时间才能运行,并且可以用低级语言更有效地完成。

第三个原因是与设备交互。 Python 本身并不包含大量用于处理声卡、串行端口等的代码。如果您的设备需要设备驱动程序,python 将通过您包含在应用程序中的预编译代码与其通信。

【讨论】:

【参考方案3】:

这里有两种可能性:

    也许 C++ 代码已经编写好并可供使用。 C++ 代码可能比等效的 Python 更快/更小

【讨论】:

【参考方案4】:

因为 C++ 提供了调用 OS 服务的直接方式,并且(如果谨慎使用)可以生成内存和时间更高效的代码,而 Python 是一种高级语言,使用起来不那么痛苦在那些完全不关心效率并且您已经拥有可以让您访问所需服务的库的情况下。

如果您是 C++ 用户,您可能想知道为什么这是必要的,但是高级语言的表现力和安全性对您的工作效率有如此巨大的相对影响,它必须经历才能被理解或相信。

我不能专门针对 Python 说话,但我听过人们谈论通过在其中进行大部分开发并仅在分析显示有必要时使用 C++ 或创建额外的库。

如果您是 Python 用户,您可能没有遇到过除了已经可用的库之外还需要其他任何东西的情况,并且您可能对从纯 Python 获得的性能没有问题(这很有可能)。在这种情况下 - 你很幸运!你可以忘记这一切。

【讨论】:

【参考方案5】:

这是一个真实的例子:我用 C 语言编写了一个 DLL 来与一些自定义硬件进行交互。然后在测试的第一阶段,我用 C 编写了简短的程序来验证不同的命令是否正常工作。编写、编译、运行的过程大概是我最终使用ctypes为DLL编写Python接口时的3-5倍。

现在,我可以更快地编写测试脚本,而不必担心在 C 中需要担心的正确变量初始化和内存管理。事实上,我什至能够在 Python 中使用单元测试库创建比以前更强大的测试。在C语言中可能吗?绝对可以,但它会花费我更长的时间,而且代码行数也会更多。

Python 中更少的代码行意味着(通常)我的主要逻辑可能出错的事情更少。

此外,由于硬件通信几乎完全受 IO 限制,因此不需要用 C 编写任何支持代码。我可以用开发速度最快的任何方式进行编程。

所以你去吧,现实生活中的例子。

【讨论】:

【参考方案6】:
    性能:

根据我有限的经验,Python 比使用 C 慢大约 10 倍。 使用 Psyco 会显着改善它,但仍然比 C 慢 5 倍。 但是,从 python 调用 c 模块只比 Psyco 快一点。

    当您有一些 C 库时。 例如,我正在大量研究 SIP。这是一个非常复杂的协议栈,没有完整的 Python 实现。所以我唯一的选择是调用用 C 编写的 SIP 库。

也有这种情况,比如视频/音频解码。

【讨论】:

【参考方案7】:

使用脚本语言的一个好处是您可以将新代码重新加载到应用程序中,而无需退出应用程序,然后进行更改、重新编译,然后重新启动应用程序。当人们谈论更快的开发时间时,其中一些是指这种能力。 使用脚本语言的一个缺点是它们的调试器通常不像 C++ 中那样功能齐全。我没有做过任何 Python 编程,所以我不知道它的调试器有什么功能,如果它有的话。

这个答案并不能完全回答你的问题,但我认为它是相关的。答案更多的是使用脚本语言的利弊。请不要喷我。 :)

【讨论】:

以上是关于实用观点:为啥要在 C++ 中使用 Python?的主要内容,如果未能解决你的问题,请参考以下文章

为啥要在条件中使用赋值?

为啥python这么火

为啥要在汇编中编程? [关闭]

为啥 volatile 在多线程 C 或 C++ 编程中没有用?

为啥要在 PySpark 中导入熊猫?

为啥要在 Python 的虚拟环境中创建 requirements.txt 文件?