2

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

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

谢谢

4

4 回答 4

4

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

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

于 2012-07-10T19:06:35.563 回答
2

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

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

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

于 2012-07-10T19:15:02.320 回答
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. 子进程:一种非常可移植的方式,以非必要的相同语言与另一个进程交互。可以在子进程中与几乎任何语言一起使用。除非您花很少的时间来回传递数据,否则速度不会很快。几乎所有交换的数据都必须序列化为 ASCII 或其他东西,但它是如此可移植、简单且松散耦合,值得考虑。
  8. 您也许可以优化您的 Python:http ://wiki.python.org/moin/PythonSpeed/PerformanceTips

不要急于用 C 进行编码——它在程序员的时间方面要昂贵得多,而且容易出现微妙的、难以发现的错误。首先在纯 Python 中运行你的代码,让程序以任何速度产生正确的结果,然后如果你发现程序太慢,分析程序以决定哪些部分需要以其中一种方式重做以上所列。通常你只需要 0-2% 的程序用纯 python 以外的东西来完成 - 也可以为尽可能多的代码节省程序员的时间。

于 2012-07-10T20:52:22.007 回答
0

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

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

于 2012-07-10T19:05:32.840 回答