从 python 调用 C 或 C++ 是如何工作的?
How does calling C or C++ from python work?
关于 "how to" 从 Python 调用 C C++ 代码有多个问题。但我想了解完成此操作后到底发生了什么以及性能问题是什么。背后的理论是什么?我希望通过理解原理得到解答的一些问题是:
当考虑需要从 python 传递到 C / C++ 然后返回的正在处理的数据(尤其是大数据)时(例如 2GB)。调用函数时,数据如何从 python 传输到 C?函数结束后结果如何传回?一切都在内存中完成,还是 UNIX/TCP 套接字或文件用于传输数据?是否完成了一些翻译和复制(例如转换数据类型),我是否需要 2GB 内存来保存 python 中的数据和额外的 +-2GB 内存来获得传递给 C 函数的数据的 C 版本? C代码和Python代码运行在不同的进程中吗?
您可以在 C、C++、Python 和许多其他语言之间调用,而无需生成单独的进程或复制任何东西。
在 Python 中基本上所有的东西都是引用计数的,所以如果你想在 C++ 中使用一个 Python 对象,你可以简单地使用相同的引用计数来管理它的生命周期(例如避免复制即使 Python 决定它不再需要该对象)。如果你想要反过来,你可能需要使用 C++ std::shared_ptr
或类似的东西来保存你的对象在 C++ 中,这样 Python 也可以引用它们。
在某些情况下,事情甚至比这更简单,例如,如果您在 C 或 C++ 中有一个纯函数,它从 Python 和 returns 中获取一些值,结果没有副作用,并且不存储输入。在这种情况下,你当然不需要复制任何东西,因为你可以直接读取 Python 值并且 Python 解释器不会 运行 而你的 C 或 C++ 代码是 运行(因为它们都在一个线程中)。
为此,有一个广泛的 Python(顺便说一句,还有 NumPy)C API,加上用于 C++ 集成的优秀 Boost.Python,包括智能指针。
关于 "how to" 从 Python 调用 C C++ 代码有多个问题。但我想了解完成此操作后到底发生了什么以及性能问题是什么。背后的理论是什么?我希望通过理解原理得到解答的一些问题是:
当考虑需要从 python 传递到 C / C++ 然后返回的正在处理的数据(尤其是大数据)时(例如 2GB)。调用函数时,数据如何从 python 传输到 C?函数结束后结果如何传回?一切都在内存中完成,还是 UNIX/TCP 套接字或文件用于传输数据?是否完成了一些翻译和复制(例如转换数据类型),我是否需要 2GB 内存来保存 python 中的数据和额外的 +-2GB 内存来获得传递给 C 函数的数据的 C 版本? C代码和Python代码运行在不同的进程中吗?
您可以在 C、C++、Python 和许多其他语言之间调用,而无需生成单独的进程或复制任何东西。
在 Python 中基本上所有的东西都是引用计数的,所以如果你想在 C++ 中使用一个 Python 对象,你可以简单地使用相同的引用计数来管理它的生命周期(例如避免复制即使 Python 决定它不再需要该对象)。如果你想要反过来,你可能需要使用 C++ std::shared_ptr
或类似的东西来保存你的对象在 C++ 中,这样 Python 也可以引用它们。
在某些情况下,事情甚至比这更简单,例如,如果您在 C 或 C++ 中有一个纯函数,它从 Python 和 returns 中获取一些值,结果没有副作用,并且不存储输入。在这种情况下,你当然不需要复制任何东西,因为你可以直接读取 Python 值并且 Python 解释器不会 运行 而你的 C 或 C++ 代码是 运行(因为它们都在一个线程中)。
为此,有一个广泛的 Python(顺便说一句,还有 NumPy)C API,加上用于 C++ 集成的优秀 Boost.Python,包括智能指针。