从python程序执行c程序

时间:2012-07-10 18:59:09

标签: python c

我是编程新手,想知道如何让python程序执行并与c程序通信。我在python中进行数学计算,并且想知道我是否可以用C编写主计算,这样计算运行得更快。我一直在阅读“从python中调用c函数”,“在Python代码中直接包含C或C ++代码”,以及“使用python中的c库”。这是一回事吗?我想要一个python程序来执行一个c程序并接收结果。

从python“调用C库函数”是什么意思?是否允许python脚本使用c库或允许脚本在c编译器中执行代码?

感谢

4 个答案:

答案 0 :(得分:4)

最简单的方法之一是使用Cython。您可以编写非常接近Python的代码,但它可以编译为C.这使得一些代码(尤其是数值计算)更快。您也可以使用Cython轻松地从Python调用C库函数,尽管ctypes也足够了。

但是,如果您确实想要执行特定的C程序,则可以使用Subprocess执行此操作。 N.B.,这比直接调用C库或Cython函数慢得多。

答案 1 :(得分:2)

在处理“数组操作”(有时也称为向量操作,但我发现这个术语与SIMD术语混淆)时,也会有相当快的numpy。如果你决定采用cython路线,你可能需要numpy,所以如果算法不是太复杂,你可能想先看看它是否足够好numpy。

请注意,您可以在此处使用两种不同的路线。您可以使用subprocess基本上向您编写的其他程序发出系统调用。这很慢,因为您需要启动一个新进程并将数据发送到进程中,然后从进程中读回数据。换句话说,每次调用都会多次复制数据。第二个路由是从python调用C函数。由于Cpython(参考和最常见的python实现)是用C编写的,因此您可以创建C扩展。它们基本上是编译的库,它们遵循某种API。然后Cpython可以加载这些库并使用里面的函数,传递指向数据的指针。通过这种方式,数据实际上没有被复制 - 你正在使用你在C中使用的python中的相同内存块。这里的缺点是C API有点复杂。这就是第三方扩展和现有库进入的地方(numpy,cython,ctypes等)。它们都有不同的方式在C函数中推送计算,而不必担心C API。 Numpy删除了循环,因此您可以快速添加,减去,乘以数组(在许多其他事物中)。 Cython将python代码转换为C然后可以编译和导入 - 通常为了获得速度,你需要提供额外的提示,允许cython优化生成的代码,ctypes有点脆弱,因为你必须重新指定你的C函数原型,但只要你可以将你的库编译成共享对象就很容易了......列表可以继续。

另请注意,如果您不使用numpy,您可能需要查看pypy。它声称比Cpython更快地运行你的python代码。

答案 2 :(得分:1)

想到的选项:

  1. Cython:Python的一种方言,可以自由地混合Python和C数据类型。通过类的几个类型注释给出适度的加速,如果给主循环所有C类型进行操作,可以更快一些。现在只是CPython,但是有人讨论过让它与Pypy合作。
  2. SWIG:一种界面/粘合语言,用于将C库与可能较大的高级语言列表(包括CPython)进行匹配。
  3. ctypes:允许您调用各个C函数并访问各个C数据类型。除非你花了很多时间在C代码中,否则不要在CPython中炙手可热。可能有点脆。也适用于Pypy。
  4. C扩展模块:CPython非常标准的东西 - 这是标准库放在一起的CPython的多少。如果使用cpyext,有些但不是所有这些都与Pypy一起使用。简而言之,你用C语言编写一个带有一堆锅炉板的模块,但它可以从CPython中调用。
  5. CFFI:来自Pypy项目的新的外部功能界面。他们现在正在与CPython合作,并且打算不久就与Pypy合作。它就像ctypes,但不那么脆弱 - 缺点是它需要在运行时使用C编译器,而且它的代码非常年轻。
  6. Pypy:这实际上并不是一种调用C本身的方式,但对于许多纯Python代码来说,它的速度几乎和C一样快。如果你没有很多你需要的C扩展模块,那么Pypy可能是你的不错选择。
  7. subprocess:一种非常便携的与另一个进程交互的方式,不一定是同一种语言。可以与子进程中的任何语言一起使用。除非你花很少时间来回传递数据,否则不要快速。几乎所有交换的数据都必须序列化为ASCII或其他东西,但它是如此便携,简单且松散耦合,值得考虑。
  8. 您可以优化Python:http://wiki.python.org/moin/PythonSpeed/PerformanceTips
  9. 不要急于用C编码 - 就程序员时间而言,它的成本要高得多,并且容易出现细微的,很难发现的错误。首先在Pure Python中运行您的代码,以使程序以任何速度生成正确的结果,然后如果您发现程序太慢,请分析程序以确定哪个部分需要以其中一种方式重做以上所列。通常你只需要在纯python以外的其他东西中完成你程序的0-2% - 也可以节省程序员时间,以获得尽可能多的代码。

答案 3 :(得分:0)

你想要ctypes。它允许您直接从Python运行C函数,而无需任何疯狂的扩展。当然,你应该确保你没有过早地进行优化。 Python的数学函数非常快。

ctypes模块允许您直接从Python代码调用C库函数。这意味着它允许您将已编译的库放在Python可以访问它的位置并运行这些已编译的函数。这与从Python调用C程序不同,正如Conrad指出的那样,可以用子进程完成。当然,子进程不需要用C编写的程序。它可以运行任何可执行文件。