我知道一堆脚本语言,(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文档的任何信息都是有用的信息
答案 0 :(得分:18)
cython
擅长两件事
它可能会从1中获得更多曝光。因此,重点放在你发现的C语言材料上。听起来你想像2那样使用它。
根据我对cython
的经验,你可以尝试编译你的python程序,看它是否有效。它会更快(也许)。为了加快速度,您需要有选择地将python类型转换为C类型。这开始带来了cython的力量。
如果您查看official tutorial,则需要了解他们使用cdef
关键字的位置。
所以回顾一下
cdef
并使其再次起作用对不起,这不是指向教程的指针,但是应该给你一个方向进入!
答案 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:
cdef
)调用比Python(def
)函数调用快得多(但灵活性较低)。 这将帮助你完成大部分工作。如果你想为大多数应用程序提供最后10-20%的加速,那么就无法了解C,以及现代流程如何工作(指针,缓存......)。
答案 6 :(得分:0)
Cython根本不支持线程。它持有GIL(Global Intrepreter Lock)的整个时间!这通过(虚拟)禁用并发执行使您的代码线程安全。所以我不会将它用于通用开发。