我是编程新手,想知道如何让python程序执行并与c程序通信。我在python中进行数学计算,并且想知道我是否可以用C编写主计算,这样计算运行得更快。我一直在阅读“从python中调用c函数”,“在Python代码中直接包含C或C ++代码”,以及“使用python中的c库”。这是一回事吗?我想要一个python程序来执行一个c程序并接收结果。
从python“调用C库函数”是什么意思?是否允许python脚本使用c库或允许脚本在c编译器中执行代码?
感谢
答案 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)
想到的选项:
不要急于用C编码 - 就程序员时间而言,它的成本要高得多,并且容易出现细微的,很难发现的错误。首先在Pure Python中运行您的代码,以使程序以任何速度生成正确的结果,然后如果您发现程序太慢,请分析程序以确定哪个部分需要以其中一种方式重做以上所列。通常你只需要在纯python以外的其他东西中完成你程序的0-2% - 也可以节省程序员时间,以获得尽可能多的代码。
答案 3 :(得分:0)
你想要ctypes。它允许您直接从Python运行C函数,而无需任何疯狂的扩展。当然,你应该确保你没有过早地进行优化。 Python的数学函数非常快。
ctypes模块允许您直接从Python代码调用C库函数。这意味着它允许您将已编译的库放在Python可以访问它的位置并运行这些已编译的函数。这与从Python调用C程序不同,正如Conrad指出的那样,可以用子进程完成。当然,子进程不需要用C编写的程序。它可以运行任何可执行文件。