当前位置: 首页 > 后端技术 > Python

什么是赛通?为什么选择赛通?

时间:2023-03-26 13:18:25 Python

wedgeCython估计很多人都听说过,它是用来加速Python的。如果你在使用Python编程时有以下想法,那么Cython非常适合你。1)因为某些需求,我不得不写一些多层嵌套循环,如果用C语言实现这些循环会快几百倍,但我不熟悉C或Python如何与C交互;2)由于Python解释器的性能原因,如果把CPython解释器换成PyPy,或者干脆换一种语言,比如Rust,会得到明显的性能提升,但不能换。因为你的项目组规定只能使用Python语言,解释器只能是CPython;3)Python是一门动态语言,但你希望至少在数字计算方面,可以加入可选的静态类型,这样可以大大加快运行效果。因为简单的数字相加不需要所谓的动态,尤其是当你的程序中有很多计算逻辑的时候;4)对于一些计算密集的部分,希望能够写出媲美Numpy、Scipy、Pandas算法的东西;5)你有一些已经用C和C++实现的库,你想在Python内部直接调用它们,而不需要使用ctypes、cffi等模块;6)也许你听说过Python和C可以无缝集成,使用C为Python编写扩展模块,将Python代码中性能关键的部分用C重写以提高性能。但这需要你对Python解释器有深刻的理解,熟悉底层的Python/CAPI,这是一件很痛苦的事情;如果你有上面的一些想法,那就证明你的Python水平很好了,但是这些问题无论如何都要解决,于是Cython登场了。注意:Cython不是一个实验项目。它已经存在了很长时间,并且已经在生产环境中进行了测试。我们完全有理由学习它。让我们开始Cython的学习之旅吧。悄悄告诉你,我个人非常喜欢Cython的语法。什么是赛通?关于Cython,我们必须清楚两点:1)Cython是一种将C和C++的静态类型系统与Python结合起来的编程语言。Cython源文件的后缀为.pyx,是Python的超集,语法是Python语法和C语法的混合体。当然我们说它是Python的超集,所以你可以写纯Python代码。2)当我们写完Cython代码后,我们需要先将Cython代码翻译成高效的C代码,然后将C代码编译成Python扩展模块。早期所有的Python扩展都是用C写的,但是对开发者有两个硬性要求:一是熟悉C,二是熟悉解释器提供的CAPI,这是一个很对开发人员的巨大挑战。挑战。另外,用C写代码,开发效率也很低。Cython的出现解决了这个问题。Cython和Python的语法非常相似。我们只需要编写Cython代码,Cython编译器就会将Cython代码翻译成C代码。所以从这个角度来说,用C写扩展就等同于用Cython写扩展。至于如何将Cython代码翻译成C代码,则取决于相应的编译器,它本质上是Python的一个第三方模块。它相当于一个翻译器。既然用C写扩展是一件很痛苦的事情,那就用Cython来写,然后给你翻译成C。因此,Cython的强大之处在于它结合了Python和C,可以让你在编写Python代码的同时获得C的高效。所以我们看到Cython相当于高级语言Python和低级语言C的融合,所以也有人称Cython为“克里奥尔编程语言”。克里奥尔人是生活在西印度群岛的欧洲人和非洲人的混合体,而Cython在这方面类似于(Python和C的)混合体。为什么选择赛通?Python和C是截然不同的语言,那么为什么要混合它们呢?答案是:因为两者不是对立的,而是相辅相成的。Python是高级语言,动态、易学、灵活。但是这些优秀的特性是有代价的,因为Python的动态特性和它的解释型语言使得它比静态编译语言慢几个数量级。C语言是最古老的静态编译语言之一,至今仍在广泛使用。从时间上来说,它的编译器已经有近半个世纪的历史了,在性能上也做了足够的优化,所以C语言很底层,同时又很强大。但是与Python不同的是,C语言没有提供保护措施(没有GC,容易内存泄漏),使用起来很不方便。因此,这两种语言都是主流语言,只是不同的特性使得它们被应用在不同的领域。Cython的美妙之处在于它汇集了Python语言丰富的表现力和动态机制以及C语言的高性能,代码编写起来仍然像Python。注意:除了极少数例外,Python代码(版本2.x和3.x)已经是有效的Cython代码,因为Cython可以被认为是Python的超集。并且Cython在Python语言中加入了少量关键字,以更好地开发C类型系统,让Cython编译器生成高效的C代码。如果你已经了解Python并且对C或C++有基本的了解,那么你可以直接学习Cython而不需要学习其他界面语言。另外,我们其实可以把Cython看成两个身份:1)Cython如果翻译成C,那么可以看成是Cython的'阴';2)如果用Python作为连接C或C++的胶水,那么它可以看作是Cython的‘阳’。我们可以从需要高性能的Python代码入手,也可以从需要优化Python接口的C、C++入手,而我们是来学习Cython的,显然选择了前者。为了加速Python代码,Cython将使用可选的静态类型声明和算法来实现显着的性能提升,尤其是静态类型系统,这是高性能的关键。Cython和CPython之间的区别?Cython最令人困惑的是它与CPython的关系,但需要强调的是两者是完全不同的。首先,Python是一门有自己语法规则的语言。我们按照Python语言规定的语法规则编写的代码就是Python源代码。但是源代码只是一个或多个普通的文本文件,我们需要使用Python语言对应的解释器来执行。Python解释器也会根据相同的语法规则对我们编写的Python源代码进行分词、语法分析等。如果我们写的代码不符合Python的语法规则,就会报语法错误,就是SyntaxError。如果符合语法规范,那么抽象语法树(AbstractSyntaxTree,简称AST)就会顺利生成,然后AST会被编译成一组指令,也就是所谓的字节码(bytescode),而最后将执行字节码。所以Python源码需要Python解释器来运行。如果我们想做一些事情,我们不能只写源代码。Python解释器必须将我们的代码解释成机器可识别的指令才能执行。.CPython是Python语言对应的解释器,也是官方的标准解释器,也是使用最广泛的解释器。基本上我们用的解释器都是CPython,都是从官网下载然后安装的。标准解释器CPython由C语言实现。除了CPython,还有Jython(用java实现的Python解释器)、PyPy(用Python语言实现的Python解释器)等。总之,要设计一种语言,就必须有相应的解释器;至于编译型语言,就是对应的编译器。最后重点说一下,我们说的CPython解释器是由C实现的,它为Python语言提供了C级的接口,也就是大家熟知的Python/CAPI。例如:Python列表,底层对应PyListObject;dictionary对应PyDictObject等。所以我们在Python中创建列表的时候,当CPython执行的时候,它会在最底层创建一个PyListObject。因为CPython是用C实现的,所以Python代码最后要翻译成C级代码,再转成机器码交给CPU执行。Cython也是如此。Cython代码也被翻译成C代码,然后C代码变成扩展(本质上也是机器码),导入后直接执行,不需要动态解释。因此,Cython是一种语言,它不是Python解释器的另一种实现,它的地位不等同于CPython,但它等同于Python。总结:Cython是一门语言,可以通过Cython源码生成高效的C代码,然后将C代码编译成扩展模块,同样需要CPython来调用。上面我们已经解释了什么是Cython以及为什么需要Cython。在下一篇文章中,我们将比较一下Cython、Python、C扩展和原生C语言之间的效率差异。以上就是本次分享的全部内容。想了解更多python知识,请前往公众号:Python编程学习圈,发“J”免费领取,每日干货分享