在Python与C中实现函数

在Python与C中实现函数,python,c,compilation,Python,C,Compilation,在Python中实现函数和在C中实现函数,然后从Python中调用函数之间是否存在差异(在执行时间方面)?如果是这样,为什么?Python(至少是“标准”的CPython实现)从未真正编译成本机代码;它编译成字节码,然后进行解释。因此,实际上编译成机器代码的C函数将运行得更快;问题是它是否会产生相应的影响。那么,您试图解决的实际问题是什么呢?Python(至少是“标准”的CPython实现)从未真正编译成本机代码;它编译成字节码,然后进行解释。因此,实际上编译成机器代码的C函数将运行得更快;问题

在Python中实现函数和在C中实现函数,然后从Python中调用函数之间是否存在差异(在执行时间方面)?如果是这样,为什么?

Python(至少是“标准”的CPython实现)从未真正编译成本机代码;它编译成字节码,然后进行解释。因此,实际上编译成机器代码的C函数将运行得更快;问题是它是否会产生相应的影响。那么,您试图解决的实际问题是什么呢?

Python(至少是“标准”的CPython实现)从未真正编译成本机代码;它编译成字节码,然后进行解释。因此,实际上编译成机器代码的C函数将运行得更快;问题是它是否会产生相应的影响。那么您试图解决的实际问题是什么呢?

通常,用C编写的函数比Python等效函数要快得多。整合也要困难得多,因为它涉及:

  • 编译C代码,其中#包含Python头并公开适当的包装器代码,以便可以从Python调用
  • 链接到正确的Python库
  • 将生成的共享库部署到适当的位置,以便Python代码可以导入它
  • 在尝试此方法之前,您需要非常确定其好处大于成本,这意味着这应该只保留给代码中性能关键的部分,因为纯Python无法使这些部分变得足够快


    如果您真的需要走这条路,Boost.Python可以让任务轻松得多。

    通常,用C编写的函数将比Python等效函数快得多。整合也要困难得多,因为它涉及:

  • 编译C代码,其中#包含Python头并公开适当的包装器代码,以便可以从Python调用
  • 链接到正确的Python库
  • 将生成的共享库部署到适当的位置,以便Python代码可以导入它
  • 在尝试此方法之前,您需要非常确定其好处大于成本,这意味着这应该只保留给代码中性能关键的部分,因为纯Python无法使这些部分变得足够快


    如果您真的需要走这条路,Boost.Python可以让任务轻松得多。

    如果我正确理解并重申您的问题,您会问,在c可执行文件上包装Python是否比纯Python模块本身更快?答案是,它取决于可执行文件和您正在执行的任务类型

  • Python中有一组使用Python C-API编写的模块。它们的性能可以和包装一个C可执行文件相媲美
  • 另一方面,包装c程序将比纯python更快,两者都使用合理的逻辑实现相同的功能。比较difflib的使用情况与基于diff的包装子流程

  • 如果我正确理解并重申了您的问题,您会问,在c可执行文件上包装python是否比纯python模块本身更快?答案是,它取决于可执行文件和您正在执行的任务类型

  • Python中有一组使用Python C-API编写的模块。它们的性能可以和包装一个C可执行文件相媲美
  • 另一方面,包装c程序将比纯python更快,两者都使用合理的逻辑实现相同的功能。比较difflib的使用情况与基于diff的包装子流程

  • C版本通常更快,但并不总是如此。加速的要点之一是C代码不必像Python那样动态查找值(Python具有引用语义)。一个很好的例子是。则数组中的所有值都具有相同的类型,并在内部存储在连续的内存块中。这是numpy速度更快的主要原因,因为它跳过了Python必须执行的所有动态变量查找。如果算法在Python数据结构上运行,那么最高效的C实现可能会变得非常缓慢,在Python数据结构中,每个值都必须动态查找


    要自己实现这些功能并省去Python C-API的所有麻烦,一个好方法就是使用它。

    C版本通常更快,但并不总是如此。加速的要点之一是C代码不必像Python那样动态查找值(Python具有引用语义)。一个很好的例子是。则数组中的所有值都具有相同的类型,并在内部存储在连续的内存块中。这是numpy速度更快的主要原因,因为它跳过了Python必须执行的所有动态变量查找。如果算法在Python数据结构上运行,那么最高效的C实现可能会变得非常缓慢,在Python数据结构中,每个值都必须动态查找

    要自己实现这些功能并省去Python C-API的所有麻烦,一个很好的方法就是使用它。

    呃,什么?对于初学者来说,您(通常)不编译Python,并且无论如何都需要一个包装器来从Python调用C函数,反之亦然。对于稍高级的用户,您是否意识到性能在很大程度上取决于算法,然后取决于实现(代码和语言实现),而不仅仅是语言?(可以使用LLVM/CLAN来解释C和C++……以及通过编译编译的Python代码的很多项目)。更不用说很多人都无法在可接受的时间内得到一个正常工作的C版本。呃,什么?对于初学者来说,您(通常)不编译Python,并且无论如何都需要一个包装器来从Python调用C函数,反之亦然。对于稍高级的用户,您是否意识到性能在很大程度上取决于算法,然后取决于impl