Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从python程序执行c程序_Python_C - Fatal编程技术网

从python程序执行c程序

从python程序执行c程序,python,c,Python,C,我是编程新手,想知道如何让python程序执行并与c程序通信。我正在用python做一个数学计算,我想知道我是否可以用C编写主要的计算,这样计算速度会更快。我一直在阅读“从Python调用C函数”,“直接在Python代码中包含C或C++代码”,以及“使用Python中的C库”。这是同一件事吗?我想要一个python程序来执行一个c程序并接收结果 从python中“调用C库函数”是什么意思?它是允许python脚本使用c库还是允许脚本在c编译器中执行代码? 谢谢你想要的。它允许您直接从Pytho

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

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

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


ctypes模块允许您直接从Python代码调用C库函数。这意味着您可以将编译后的库放到Python可以访问的地方,然后运行这些编译后的函数。这与从Python调用C程序不同,正如Conrad所指出的,C程序可以通过子进程来完成。当然,子流程不需要用C编写程序。它可以运行任何可执行文件。

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


但是,如果您确实想要执行一个特定的C程序,您可以使用。注意,这比直接调用C库或Cython函数要慢得多。

在处理“数组操作”(有时称为向量操作,但我发现该术语与SIMD术语混淆)时,numpy的速度也相当快。如果您决定使用cython路线,您可能需要numpy,因此如果算法不太复杂,您可能首先想看看numpy本身是否足够好

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


还要注意的是,如果您不使用numpy,您可能希望签出pypy。它声称运行python代码的速度比Cpython快

想到的选项:

  • Cython:Python的一种方言,可以自由混合Python和C数据类型。使用一些类型注释为类提供了适度的加速,并且如果您将主循环的所有C类型都提供给它来操作,那么速度会快很多。目前几乎只有CPython,但已经有人讨论过如何让它与Pypy一起工作
  • SWIG:一种接口/粘合语言,用于将C库与潜在的大量高级语言(包括CPython)相匹配
  • ctypes:允许您调用单个C函数并访问单个C数据类型。除非你花很多时间在C代码上,否则不要在CPython中燃烧。可能有点脆。也适用于Pypy
  • C扩展模块:CPython非常标准的东西-这是多少CPython的标准库放在一起。如果您使用cpyext,其中一些(但不是全部)可用于Pypy。简而言之,用C语言编写一个包含一堆锅炉板的模块,但它可以从CPython调用
  • CFFI:来自Pypy项目的一个新的外部功能接口。他们现在正在与CPython合作,并打算不久后与Pypy合作。它类似于ctypes,但不那么脆弱——缺点是它在运行时需要一个C编译器,而且代码非常年轻
  • Pypy:这并不是调用C本身的一种方式,但是对于许多纯python代码来说,它的速度几乎和C一样快。如果您没有很多需要的C扩展模块,那么Pypy可能是一个不错的选择
  • 子进程:一种非常可移植的与另一个进程交互的方式,不一定使用相同的语言。可以与子进程中的任何语言一起使用。不要太快,除非你花很少的时间来回传递数据。几乎所有交换的数据都必须序列化为ASCII或其他格式,但它是如此可移植、简单且松散耦合,因此值得考虑
  • 你可以