21

我知道一堆脚本语言(python、ruby、lua、php),但我不知道任何编译语言,如 C/C++,我想尝试使用 cython 加速一些 python 代码,这本质上是一个 python - > C 编译器,旨在为 python 创建 C 扩展。基本上,您使用更严格的 python 版本进行编码,该版本编译为 C -> 本机代码。

这就是问题所在,我不知道 C,但是 cython 文档是针对那些显然已经知道 C 的人(没有解释,只介绍),对我没有帮助,我需要知道是否有任何好的针对 python 程序员的 cython 教程,或者如果我在学习 Cython 之前必须学习 C。

请记住,我是一个称职的 python 程序员,我宁愿从我已经擅长的语言的角度学习 cython,而不是为了学习 cython 而学习一门全新的语言。

1) 请不要推荐 psyco

编辑:任何有助于理解官方 cython 文档的信息都是有用的信息

4

7 回答 7

18

cython擅长两种不同的事情

  1. 与 C 语言库的接口
  2. 加速 Python 代码

它可能会从 1. 中获得更多曝光,因此强调您找到的针对 C 内容的教程材料。听起来您想像 2. 一样使用它。

根据我对您的经验,cython您可以尝试编译您的 python 程序,看看它是否有效。它会变得更快(也许)。为了获得更快的速度,您需要有选择地将 python 类型转换为 C 类型。这开始带出cython的力量。

如果您查看官方教程,您需要研究他们在哪里使用了cdef关键字。

所以回顾一下

  1. 用 cython 编译你现有的 python 程序,尽可能少的改动
  2. 将一些变量声明为cdef并使其再次工作
  3. 如果不够快,请转到步骤 2。

很抱歉,这不是指向教程的指针,但它应该给你一个前进的方向!

于 2009-10-17T12:45:34.383 回答
8

学习C!(对不起——不可抗拒。)

不过说真的,您似乎最需要了解C 变量类型(如果您愿意的话,可以使用 C 类型)才能cdef有效地使用。

稍后,如果您决定硬着头皮正确学习 C ,请在Amazon上购买Kernighan 和 Ritchie或 K&R的副本。

于 2009-10-17T13:45:01.807 回答
2

你看过这个:http ://www.perrygeo.net/wordpress/?p=116似乎是一个很好的概述。您还可以查看 pyzmq 和 gevent 中的源代码 - 他们使用 Cython 作为其核心代码。

于 2010-09-23T14:15:43.620 回答
1

Cython 确实支持并发(您可以将本机 POSIX 线程与 c 一起使用,可以在 extent ion 模块中编译),您只需要小心不要在 GIL 发布时修改任何 python 对象并记住解释器本身是不是线程安全的。您还可以在 python 中使用多处理来使用更多内核进行并行处理,这反过来可以使用您编译的 cython 扩展来加快速度。但总而言之,您肯定必须了解 c 编程模型、静态类型等

于 2012-05-17T20:57:10.507 回答
1

如果你能回答以下 C 测验,你可以用 Cython 做很多非常有用的事情......

(1) 什么是双标?什么是整数?

(2) “编译”这个词是什么意思?

(3) 什么是头文件 (.h)?

要回答这些问题,您无需阅读整本 C 书!...也许是第 1 章。

一旦你可以通过该测验,请再试一次教程。

我通常做的是从纯python代码开始,一点一点地添加Cython元素。在这种情况下,您可以一点一点地学习 Cython 的功能。例如,我不懂 C 字符串,因为到目前为止我还没有尝试对涉及字符串的代码进行 cythonize。当我这样做时,我将首先查看字符串在 C 中的工作方式,然后再查看字符串在 Cython 中的工作方式。

同样,一旦你开始使用 Cython,你会时不时地遇到一些需要学习更多 C 的复杂情况。当然,你知道的 C 越多,你就会越灵巧地充分利用 Cython,而不是如果出现问题,请提及故障排除。但这不应该让你不愿意开始!

于 2012-06-19T14:45:38.613 回答
0

关于你真正需要知道的所有 C 语言是:

  1. C 类型比 Python 类型快得多(添加到 C 整数或双精度可以在单个时钟周期内完成)但不太安全(它们不是任意大小并且可能会静默溢出)。
  2. C 函数 ( cdef) 调用比 Python ( ) 函数调用快得多def(但灵活性较差)。

这将使您大部分时间到达那里。如果您想勉强为大多数应用程序提供最后 10-20% 的加速,那么了解 C 以及现代进程的工作原理(指针、缓存......)是没有办法的。

于 2010-04-06T03:16:56.340 回答
0

Cython 根本不支持线程。它一直持有 GIL(全球解释器锁)!这通过(实际上)禁用并发执行使您的代码线程安全。所以我不会将它用于通用开发。

于 2010-12-14T23:48:02.000 回答