Noob-Ready Cython教程

时间:2009-10-17 12:33:59

标签: python c cython

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

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

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

1)请不要推荐psyco

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

7 个答案:

答案 0 :(得分:18)

cython擅长两件事

  1. 与C语言库接口
  2. 加速Python代码
  3. 它可能会从1中获得更多曝光。因此,重点放在你发现的C语言材料上。听起来你想像2那样使用它。

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

    如果您查看official tutorial,则需要了解他们使用cdef关键字的位置。

    所以回顾一下

    1. 使用尽可能少的更改使用cython编译现有的python程序
    2. 将某些变量声明为cdef并使其再次起作用
    3. 如果不够快,请转到第2步。
    4. 对不起,这不是指向教程的指针,但是应该给你一个方向进入!

答案 1 :(得分:9)

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

但是,严重的是,您似乎最需要了解C variable types(C类型,如果您愿意),以便有效地使用cdef

稍后,如果您决定咬紧牙关并正确学习C,请将自己视为Kernighan and Ritchie或K& K的副本。 R,可在Amazon上找到。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

Cython确实支持并发(你可以使用带有c的原生POSIX线程,可以在extent离子模块中编译),你只需要小心,不要在发布GIL时修改任何python对象,并记住解释器本身不是线程安全的。您还可以使用python多处理来使用更多内核来实现并行性,这可以反过来使用已编译的cython扩展来加速更多。但总而言之,你必须要知道c编程模型,静态类型等

答案 4 :(得分:1)

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

(1)什么是双?什么是int?

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

(3)什么是标题(.h)文件?

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

一旦您可以通过该测验,请再次使用本教程。

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

再一次,一旦你开始使用Cython,你现在会遇到一些需要学习更多C的复杂功能。当然,你知道的C越多,你就会越充分利用Cython,更不用说在出现问题时进行故障排除。但这不应该让你不愿意开始!

答案 5 :(得分:0)

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

  1. C类型比Python类型快得多(添加到C ints或double可以在一个时钟周期内完成)但安全性较低(它们不是任意大小的,可能会无声地溢出)。
  2. C函数(cdef)调用比Python(def)函数调用快得多(但灵活性较低)。
  3. 这将帮助你完成大部分工作。如果你想为大多数应用程序提供最后10-20%的加速,那么就无法了解C,以及现代流程如何工作(指针,缓存......)。

答案 6 :(得分:0)

Cython根本不支持线程。它持有GIL(Global Intrepreter Lock)的整个时间!这通过(虚拟)禁用并发执行使您的代码线程安全。所以我不会将它用于通用开发。