首页 > 互联资讯 > 网络资讯  > 

Python是不是被严重高估了?

Python不仅是被严重高估,而是被严重误解。

即便对Python已经掌握到一定程度,但对Python仍然存在误解大有人在。而造成这种误解的很大部份原因是国内过度吹嘘Python宣传。通常说的Python其实就是CPython实现。然而Python演变至今是一种符合其语言标准的开放平台。CPython不能代表其他Python实现,笔者的观点必须严格区分不同的Python实现。

本篇文章从大部分搞Python培训号的对立面回答了他们不愿意回应Python学习者种种挖坑、割韭菜的敏感问题。CPython社区存在很多禁忌的话题,例如CPython鼓吹者不愿意提及PyPy和Cython的话题,这里都会提到。

Python前端:即Python解释器:具体有CPython、PyPy、Jython,主要实现Python代码到字节码编译、执行、Python对象的内存管理等。Python后端:Cython是Python的超集,Cython作为Python后端的编程语言,和C/C++构成整个Python软件生态的基石。而PyPy实现中,RPython可编译为C扩展并通过PyPy前端的rffi接口调用。为什么要区分不同Python实现?

这是我整篇文章展开“Python争议性话题”的定调。区分不同Python实现是因为“Python”会被大部分Python用户仅停留一门语法简单的语言的认识,但这样理解的话,这部分Python用户会被误导至潜移默化地接受“Python就等同于CPython”。那理解下面这些话题就极具误导性的,要么理解过于武断、片面、要么就会被人为误导犯了“强盗逻辑”上的错误。

概要说一些案例,你就深有体会了,Python入门简单、但深入下去Python某个领域的应用,其学习曲线一点都不比其他编程语言低。

案例1:“Python适合写算法”或“Python不适合写算法”,不区分Python实现前提,其实都是错误的结论。由于没“Python实现”概念的Python用户会犯致命的错误“用CPython跑Python代码实现的算法”,因为CPython执行效率极低,然而用Jython、PyPy跑Python代码实现的算法即还能接受,甚至你用RPython编译同样的算法(该算法要符合“RPython语法限定”),RPython会编译成该算法的C版本,它的执行效率会比Jython、PyPy、Cython都要快出10倍都不止。例如跑sieveOfEratosthenes算法,查找指1~100,000,000到所有质数,不同的Python实现的时间开销对比(单位:秒),具体见《铁甲万能狗:第23篇 深入理解RPython(入门篇)》案例2:“PyPy实现是用Python语言实现的”。该结论不完全正确,如果你理解RPython的话,PyPy底层的源码最终行表示形式,默认是C语言,PyPy的Python源代码只是中间语言而已。案例3:“Python快过C/C++”。你别笑,知乎真有人这么说。见下文的,这是是一个比较典型“强盗逻辑”案例,但如果你区分不同Python实现,会辩证地看待。同样Python代码业务逻辑,PyPy、Numba内置的JIT引擎优化的执行效率,某些情况下会非常接近C版本业务逻辑的,但不可能比C/C++快。

在Python应用中存在那么多误解,当中笔者挑一些最为误导他人、颇具争议的问题来展开详细论述。同时笔者也会在本文中推荐一些靠谱的Python学习资源。

Python学习、就业问题

以就业目的为方向,不论学习Python还是其他语言,千万不要为了程语言而学。而是根据你的未来的就业方向选择学语言。而不是根据语言去学习。这样目标、学习路线会清晰很多。千万不能本末倒置。

先搞清学习语言最终目的是什么,如果是基于兴趣,你那么下面的内容可以直接不用看。相信其他学习知乎其他Python答主已经给出很好的学习线路,我自己关注几个Python答主他们的文章都很优秀,可以翻我关注的知乎好友看看。我重点是谈Python就业方向的问题,以及Python和其他语言存在竞争和共存的关系。先谈谈Python就业方向的问题。掌握中级Python水平的可以选择的职业方向的门槛很低, 但有些门槛高得大部分人是无法触碰的。

门槛低的Python或多或少相关的职业:例如初级运维工程师、数据分析、跨金融领域的量化交易会用到Python、一些网络安全岗位也会用到Python,比如“Cisco的初级CCNA工程师”就要求具备Python编程能力。这些岗位的特性,都不要求学习者深入理解系统原理,因此不要求用到C,Python相关低门槛的IT岗位,更多要求从业者夸专业和横行性多重技能。

Python数据分析

如果要深入了解数据分析的小伙伴,笔者建议你了解一下知乎的数据分析实战教程,符合打算从事数据分析岗位的人群,笔者跟其他平台的数据分析课程对比过,该课程适合面对零基础 、初级 、 中级的学习群体,能帮助学习者建立自己的数据分析思维和方法论打下坚实的基础。

该课程的特点是讲解常用模型+架构逻辑,通过互联网大厂的一线案例说明各种分析方法的运用,帮助学习者构建数据分析思维,带大家快速掌握常用的数据分析工具。课程共3天6小时、一线大厂的数据分析行业的名师为学员提供一对一的问题答疑、就业等问题辅导。

开发岗位相关

另外,Python非常适合副业例如用Python以私单的形式接一下小型项目是非常不错的选择。给自己打个广告:“笔者在Java、Python的私活也会接,如果有二次开发项目、中小型项目需求的,可以给笔者私信”。

对于大型的Web全栈开发,市场需求的语言是Java/Go,大型Web后端的商用环境几乎不会考虑用Python。因为原生CPython本身执行效率面对多用户并发和后台繁重的密集型计算原生CPython是应付不了的。要Python应用于大型的项目开发,可以用高性能的第三方Python实现技术来替换CPython,但这种维护成本其实相比Java、Go一点也不低。因此,用Python做全栈大部分是小规模的科技公司或制造业类型的企业,因为开发出来的受众面不会太大,业务系统的性能问题不是考察的重点,而是开发效率。后端开发岗位、算法开发岗位、Linux开发岗位实质上 用到的是C/C++、甚至Python和C的混便技术、高级运维开发工程师会用到Python、Go、Shell、甚至是C。因此即便学会Python,光懂Python也找不到这些岗位工作,这本质上已经不是Python语言的问题,而是这些岗位要求从业者最起码有3年以上相关工作经验,对数据库、系统操作原理和开发用到什么工具要有一个系统性的知识背景。

高门槛的Python岗位:人工智能虽然用到是Python语言,但本质已经和Python语言关系不大、更为重要的是那些领域要求从业者计算机硕士以上学历,以及深厚的数学、算法功底做加持。大部分非科班或者条件达不到的连门槛都够不着。如果你日后打算从事AI领域的岗位,并这些是都是硬性条件:

考入一所有AI相关专业的高校吃透大学计算机专业要求的数学课程。取得计算机专业统招的硕士以上学历。

所以非科班的或者零基础转行听信培训宣传之类能从事这部分领域工作的话,可以洗洗睡。

但不是说没有靠谱的Python课程,但答主仍然强调,光学会“Python”是找不到的工作的。Python只是一个工具,重点是与该岗位相关的其他职业技能。例如量化交易,就需要从业者有金融知识和操盘实战的经验。

如果后面选择学习Python培训机构的课程,自己要擦亮眼睛,一些跟Python沾边的培训课程:“Linux云计算、数据挖掘和分析、量化交易、自动化运维”也有靠谱的培训课程,结合自己的专长可选择相关课程。

上面Python相关职业的问题,如果打算深入学习Python,到中期就要面对Python性能瓶颈的问题。Python应用规模到达一定程度,会不得不面对一个问题就是性能会急剧下降,因为官方的CPython内核的执行效率其实是非常低的,要严格区分不同的Python实现,深入学习Python的话,一定要掌握PyPy、Numba、Cython这些第三方Python技术。此时你可以考虑学习C来很大程度上改善CPython执行效率。有扎实的C基础的话,可深入Cython语言。将Python程序中严重拖慢程序性能的Python代码迁移到Cython中,并且编译成Cython扩展,让CPython、PyPy前端去调用。

为什么有很多程序员不喜欢Python?

Python新手请耐心看完下面這一贴和本贴的所有评论对Python的现状有个整体的了解。

Python是某个领域的专用语言纯属扯谈

例如,经常听说“Python是AI领域、网络爬虫的专用语言”是这类谎言代表者。撮破这类谎言的核心概念就是CPyExt编程接口,这是Python前端和Cython扩展交互的程序接口。

就AI常用Cython扩展库来说,Scikit-learn实现它的语言实现是Cython、Pytorch实现的语言是C++,这些库的语言实现跟CPython本身没半点关系,而Cython本身已经实现的任何轮子已经封装了CPyExt的相关函数接口,供CPython、PyPy这些Python前端调用而已,而轮子本身绝大部分核心算法是Cython和C/C++混编的代码、或Cython对C代码的封装完成的,而Cython扩展之所以能和PyPy、CPython这些Python前端交互,因为它们遵循一个Python/C接口(即CPyExt编程接口),跟Python前端任何一个Python解释器没半点关系,就是这个原因.

可以梳理一下不同Python前端实现、以及对应后端用到的编程语言、以及用到的编程接口的关系。

Python前端实现后端轮子库的编程语言编程接口CPythonCython、C、C++cpyext、cffiPyPyCython、C、C++、RPythoncpyext、cffi 、rffi、hpyJythonJava不详IronPythonC#不详RustPython-未稳定

在PyPI平台托管的绝大部分Python扩展库、几乎可以实现CPython和PyPy跨平台共享,因为这些Python前端实现遵循统一的编程接口,但编程接口的实现细节在CPython、PyPy内部是完全不一样的。比如pip install cython,安装cython编译器,不能将CPython下的cython编译器移到到PyPy中使用。必须在PyPy下执行同样的pip安装指令,但PyPy下执行pip时会自动完成对Python扩展的源码编译工作。

cpyext是对接Python前端,而cffi、rffi这些编程接是对接原生的C代码,例如cffi/rffi可以调用你手头上现成C库(比如window下的*.dll,Linux下的*.so)。但需要程序员手动写分配内存、各种调用逻辑的硬代码太过繁琐,于是就出现了Cython、PyBind这些工具,这些工具内部已经封装了cpyext、cffi接口的调用。

值得一提的是,PyPy本身还有一个私有的编程接口rffi,它是从cffi衍生而来,这是PyPy、RRython专用接口,在调用C代码方面它比CPython的cffi需要更低的性能开销。换句话说,遵循RPython语法限定的Python代码被RPython编译成C扩展后,被PyPy前端通过rffi接口调用,足以说明PyPy本身有能力实现“自供自消”的软件生态循环。

但目前PyPy官方并只是将RPython作为PyPy的一个子项目,没重视起来。笔者猜测:“嗯,推倒CPython是首要任务嘛”,PyPy官方引用Guido的名言:“If you want your code to run faster,you should probably just use PyPy.”,这是对CPython最大的嘲讽 - ___,-!!。

这里有个比较有趣的问题,笔者有个假设:"Jython能调用Cython扩展吗?"。可行性是客观存在如下两点,但实现的难度会比PyPy、CPython大,更难的是Jython在Python领域是比较冷门的Python实现,没代码贡献者愿意为Jython在实现C代码调用添砖加瓦。

Jython底层语言是Java,理论上Jython底层如果实现一套模拟PyObject对象中引用计数管理、GIL管理的一套模拟逻辑(模拟必定产生性能开销,PyPy的内部某种程度上是这么干的),以及实现遵循CPyExt的调用接口Jython是可以通过类似JNI模拟并实现CPyExt的编程接口,达到调用Cython扩展的目的。

关于第二点笔者是有理论依据支持的,根据《Python高性能编程》第25章《扩展和嵌入 Jython》

引用这些论据的目的是说明一个基本事实:“Python生态中不可取代的是Cython和C,而非CPython本身、Cython并非CPython专属技术”。

Python适合写算法和数据结构实现吗?

不少算法类入门书籍、培训机构贩卖的算法教程会拿CPython的易用性跟算法实现作为卖点,他们所指的“Python”其实就是CPython。因为执行效率极低的CPython跑Python代码实现的算法和数据结构,跟其他静态语言跑相同的算法相比,其时间开销放大数十倍到数百倍、甚至数千倍。

在C、C++、C#、Java这些静态语言中找到算法实现的种种合理性,只要你稍微理解过CPython源代码实现,这种合理性在CPython中是不存在的。算法学习的最终目地是令你写的代码执行效率尽可能地快,并且更好的阅读性。

我为什么这么说呢?熟悉C的同学、可以自行阅读一下CPython内核的源代码,感兴趣的可以关注笔者个人主页下的其他专题

现实中用CPython来写算法是很扯的做法,每条Python语句会解释为对应的字节码。我们先来梳理一下Python代码、字节码指令、以及CPython内核函数的一些关系。你就明白用CPython写算法实现是一件多么蛋痛、吃力不讨好的事情。

一条Python语句等价2-4条指令字节码指令不等。每条字节码指令实质上在CPython内核opcode.h头文件中有一个特定整数与其对应。CPython虚拟机执行字节码指令是依靠ceval.c源文件中的一个事件主循环来不断匹配switch 控制结构每个case分支中字节码指令。每个字节码case 分支分别静态调用了对应多条的CPython内核的C函数。那么执行一个字节码指令行最终实质上调用该字节码case分支的多条C函数。

那么简单来说1条Python语句与字节码指令是1对多的关系,而一条字节码指令和CPython内核函数又是一对多的关系。如下图所示。

当你使用Python语句实现某个排序算法,该算法实现本身在语义上增加了多余的代码语句,CPython解释器在编译对应的Python语句时会额外生成多余的字节码指令。那么执行纯Python代码实现的算法与会比CPython调用其C底层实现相同算法实现要慢成百个甚至上千倍都不止。CPython内置的查找、排序这些算法本来就是C实现的。本来很轻松的一个C调用就能解决的问题。非的用CPython去绕一大圈来解决同一个问题。这不是蛋疼是什么!

另外,CPython的虚拟机执行指令是非常低效的,其CPython函数调用执行纯粹是基于CPython构建的栈帧对象执行,一条指令少则2-3次入栈/出栈操作,多则4-5次。其次CPython的虚拟机实现无法像C/C++程序那样 充分利用x86_64架构多余的物理寄存器缓存多个内部变量,因此无法减少其函数栈的时间开销。

选择一门开发语言学习算法和数据结构,更不应该使用CPython之类的解析语言,学习算法实现的其中一个重要阶段是算法/数据结构的效能测试,也就是在检测一个算法在不同阶段,测试代码执行该算法/数据结构返回的时间开销和空间开销,以判断你的算法实现上下文中找出性能瓶颈的代码,用一个纯CPython实现的算法或数据结构,从CPython的内存管理和其底层的执行机制来说,CPython返回和其他更低层静态语言实现相同算法(或数据结构)相比,返回更大偏差的参考数据,这样的效能测试得到结果毫无参考意义可言,这样对于算法学习者是一种严重的误导。对于熟悉C、C++的开发者并且稍微阅读过CPython实现源代码都能悟出的一个基本共识--CPython不适合用于算法和数据结构实现!!

因此,答主打心底里极端BS那些拿Python来商业炒作,收割韭菜的行为。

Python更适合调用C/C++底层实现的各种算法接口,并不适合作为算法实现。那肯定有人问,我想用类似Python的语法去写算法和数据结构,有什么方法吗?Python软件生态,有众多的第三方Python替补方案。

基于Java实现的Jython解释器。基于.Net实现的IronPython解释器能和CPython交互或直接取代CPython,更优化的第三方实现PyPy、Numba、Cython。这些技术本源就是编译器,将Python代码不同程度地降级为机器码运行,被编译的部分尽可能绕过CPython内部的类型检查和低效的内存垃圾管理。

PyPy即是完全谋求取代CPython解释器的Python实现,而且它几乎可以无缝和Cython扩展交互。笔者在实际Python和C的混编程中,更多地选择它。PyPy目前已经解决了绝大部分常用Cython扩展的调用和模拟Python C/API低效和兼容性的问题。

PyPy源代码使用了符合RPython语法限制的Python语言实现的,那会有人跟我杆以下这个问题。

PyPy不就是Python语言实现的吗?

而跟我抬杠这个问题之前,也请你先去理解好RPython内部实现原理再跟我理性来探讨PyPy内核实现。

严格来说,PyPy内核底层最终的实现语言其实还是C,因为PyPy本身是基于RPython语法规范的Python语言实现的,PyPy内核的三大核心组件实现:Python字节码解释/编译器、GC内存管理器和JIT编译器,RPython编译框架最终还是Python实现的代码转译成C代码的表示形式。这个图可以很好地总结了PyPy和RPython的关系

有趣的是,PyPy的三大核心组件更多借鉴了JVM、.NET虚拟机的实现原理。PyPy的字节码编译/解释器用Python语言重写,绝大部分字节码的解析和编译部分,PyPy跟CPython是一致的,当然PyPy在Python字节码引擎部分也加入自己的私货,但这不是我现在关注的。这是PyPy为什么可以最大限度兼容符合CPython规范的Python代码根本原因所在。

备注:RPython即阉割CPython动态性的Python语言,你可以理解为静态版本的Python实现。为什么PyPy以自托管型的Python实现著称,因为RPython就是PyPy实现的基本盘,PyPy要增加什么新特性,只需修改上层的PyPy源代码实现,并且由RPython编译平台翻译为C代码并编译成可执行程序即可。然而PyPy开源项目代码经历多次更新,而RPython源代码几乎还是保留了绝大部分Python2.7语法的特性。

Python有可能快过C/C++吗?

理智的读者可能会问“笔者你不是在搞笑吗?这个问题不是伪命题吗!”我没搞笑,真有大神敢发表高论说“Python会比C/C++”快的。来看些喜文乐见的观点。链接在这里

某两位被评为优秀答主的观念,简直令我大跌眼镜,笔者曾经对其中一位关注过,后来默默取消关注了。如果看官懒得看截图中某两位答主的评论,我概括一下他们的中心论点“类似simd、汇编jit这些技术是CPython自家技术一样专属似的,所以Python比C/C++快!!”,这些观点我不敢恭维,大部分理智的读者都对此评论一一做了合理性的反驳,但对于Python新手明显很容易误导。

说“Python比C/C++快这类观点”、“Python是AI领域的专用语言”和“为什么要区分Python实现,不都是一家吗”本质上是一种“强盗逻辑”,很多不是CPython原生的第三方加速技术(不论SIMD优化也罢、还是Cython加速、或PyPy、Numba、PyJion这些JIT编译加速)非要说成CPython自家的东西。当然这类论点的初衷究竟是什么,我相信清醒的程序员都知道什么回事。

第三方Python实现对C扩展生态的兼容性问题

截至到目前,众多第三方Python前端实现当中,PyPy3.7以后的稳定版本对主流的Python C扩展的兼容性是跟紧CPython的脚步的。从爬虫、Web框架、大数据分析等这些常用的库,PyPy的稳定版本 对这些主流的Python扩展是高度兼容的。PyPy支持cffi、cppyy这些C扩展的调用方式,并且可以运行流行的 python 库,如 twisted 和 django。 它还可以通过C扩展兼容层(即CPyExt)运行 NumPy、Scikit-learn 等这些Cython扩展,而PyPy调用这些Cython扩展的产生的性能开销也逐渐跟CPython逐渐拉近。我之前说了,PyPy跟CPython可以共用PyPI平台下托管的绝大部分常用的C扩展的源代码,现在主要的问题是,你通过PyPy的pip指令下载的C扩展的源代码编译时间可能会比CPython更长一些。

当然,如果你熟悉C扩展开发的,可以通过PyPy私有的rffi调用接口,自己定制这些第三方C扩展的封装层获得比CPython调用C扩展更低的性能开销,但这已经不是Cython层面的封装技术,因为rffi属于RPython编译框架的调用C扩展的封装技术.

如果使用Jython、IronPython写的代码就无法很好地兼容原生支持CPython的C扩展库。因为Jython、IronPython是要完全替换CPython解释器,涉及到CPython调用的第三方C扩展的业务代码,对于Jython、IronPython来说,你不得不重构不兼容的部分。这通常是得不偿失的。使用Jython、IronPython的唯一优点是他们的执行效率要远远高于CPython。

而Cython在众多第三方Python实现中原生支持CPython的,Cython写的源代码在编译后是作为CPython的C扩展在运行时加载的,众所周知、C编译后的程序是基于特定硬件平台的机器码,不存在像Java等高层语言内部虚拟机执行字节码的时间开销,而是基于更底层的系统资源运行(即堆、栈、以及CPU寄存器),因此Cython编写的算法在编译C扩展后的执行效率和原生的C代码实现在执行效率上是几乎是等同的。另外,Cython对PyPy优化的中间层Python代码也有很好的兼容性。这也是本文要重点介绍它的原因。

你可以基于Cython的语法规则写算法和数据结构实现,因为以下两点

cdef关键字修饰的类容器.cdef/pcdef 关键字修饰的函数、类属性、类方法。

它们会在编译时会被转换为高效的C代码,我们可以将那些涉及频繁运算密集型业务逻辑转移到Cython,让Cython去处理,Cython只需将计算结果返回给CPython底层Python的C函数接口。

CPython的短板在哪里?

学习Python时,不要被网上那些Python招学员的商业广告所忽悠,Python并不是被那些商业广告吹虚得那么完美,Python是一种低效的语言,因为以下原因。

因为它单一化的内存回收机制-引用计数器必须使用GIL为其保驾护航,而GIL是限制了Python内部多线程并发主要元凶另外每当处理一个内部的Python对象,意味值无时无刻伴随着低效的动态类型检测和内部C类型转换、以及堆内存分配(我们叫这一个过程动态派遣),尽管一些小于512字节的小型对象有一些内存缓存机制,但在实际项目中频繁实例化和销毁大型对象的场景,就派不上用场,例如大于256的任意数字对象在Python中注定是低效的。每执行一个字节码指令,可能涉及额外2-4次甚至会更多次数的数据栈出栈、入栈操作和CPython内部的Python/C函数接口的调用,这是双重的栈开销,一个是C运行时的函数栈开销,另外一个是基于Python对象的数据栈开销。

因此在你决定使用Python部署你的应用系统时,需要考虑清楚用什么补救方案来改善你的Python业务逻辑,因为只要你用纯Python写的业务代码都是慢速的代码,为什么更多思维清晰的程序员将Python作为一种胶水语言来看待,从目前看来它只适用于衔接各种第三方C扩展的业务逻辑,在一个大型的工程中,当处理业务逻辑代码量达到一定比重,意味着你的整个工程项目的性能会急剧下降,因为使用原生Python写的代码都会很慢(原因罗列在上文)。但并不意味着Python不适合大型项目的开发,因为像PyPy、Numba、Cython这些已经非常成熟,能加速你的Python代码,而本专题主题是Cython。

Python适合大型项目吗?

例如整个Python应用项目,基于PyPy + Cython、PyPy+RPython编译C扩展这种模式可以构建大型的Python程序项目。但这种项目的环境已经不属于纯Python代码应用的范畴。因为Cython是用于Python后端的一种Python和C混编的编程技术,而PyPy和Numba这些带JIT编译器的Python技术引用项目,主要为了解决Python前端性能瓶颈问题。这种PyPy因为自带JIT编译器可以对一些多循环、存在大量局部变量可以Python函数、类方法采取内联优化。直接降级为机器码去独立执行(某些程度下,Cython的cdef关键字也干这种事。区别在PyPy是运行时的即时编译、Cython是静态编译后,运行时加载)。

CPython并发性鸡勒、多线程是伪的,这些CPython骨子里的劣根性的源头是GIL,吹嘘Python完美到上天的几乎是不会谈及的话题,这似乎成了影响割韭菜的“禁忌”。在Python项目中要真正根除GIL,目前来说是无可能的。因为在Cython、C、C++构建的Python软件生态,只要你使用到的轮子涉及到和CPython前端交互的,都存在GIL。也就是说,在纯CPython模式、或CPython和Cython交互的代码上下文都存在GIL,无法使用类似JVM中,多核并行的多线程技术解决并发的需求。Pyton前端内部是不适合使用纯Python代码写一些多线程运算逻辑的(例如调用threading模块,去做一些复杂的CPU密集型的运算操作,简直是做死。会引发无谓的GIL资源抢夺,甚至是线程死锁问题。

但事物有两面的,Python前端更适合的是多并发I/O请求的应用场景。那么异步I/O就有用武之地。Python的async上下文都是在一个单独主线程的事件循环中完成所有并发I/O的任务的轮询、协同调度、执行。因为在同一个线程内部,就不存在引发多线程争夺GIL资源的问题,从而规避了GIL持有/释放这些高时间成本开销的问题。

另外在Python后端内部,更适合处理一些CPU密集型的运算任务,因此,你可以将一些涉及多核并行运算的业务逻辑放到Cython中以纯C模式的函数内部,配合with nogil(排除GIL干扰)和openMP、prange这些手段实现复杂的多线程并行运算。这里说的C模式就是Cython中所与涉及并行运算的传入参数、局部变量均不参与Python前端的交互,例如在一个cdef关键字内部、只要函数形参、局部变量、返回值存在静态类型指定,就是所谓的C模式。

说到这里,PyPy /CPython + Cython这种组合,更适用于Python前端异步I/O处理并发请求,将这些请求传递给后端的Cython,而Cython内部并行运算代码处理这些请求,将返回结果经由一个def函数对cdef函数的return操作,将结果重新封装成PyObject对象返回给Python前端。

笔者认为如果你喜欢Python必须敢于面对它现在的短板。可以学习更多的CPython以外的其他Python技能,提升你的Python程序质量。

RPython、CPython、Cython的关系

在编程语法角度来说,Cython是CPython、PyPy实现的超集,就有点类似C++与C的关系。现在Python的pip仓库,只要涉及第三方的C扩展库,Cython语言实现的已经占有很大的比重。举个例子openpyxml这个扩展底层用到的lxml扩展,其实就是Cython语言实现的,还有像Numpy,Pandas和Scikit-learn这些基础的扩展也大量地使用了Cython。

有趣的是,众多Python实现中,可以用集合来表示RPython、CPython、Cython三者的关系,由于RPython走的路线是将CPython实现支持的所有动态语言特性加以限制,这些特性会给Python代码带来严重的性能问题。一切的出发点尽可能提升Python代码的性能。

而Cython所走的路线是兼容CPython的所有特性,尤其Cython要完全兼容CPython的CPext接口,Cython编译的C扩展因此包含Python/C接口的实现细节,由此调用时会带来一定的性能开销。而RPython编译后的C程序则不存在这些代码开销。换句话说,绝大部分情况下,RPython会比Cython性能要高出许多的根本原因。这里没有提及PyPy是因为PyPy实现本身就由RPython实现编译后的产物(这是自托管型编程语言的特点,用Python中间语言重新实现更优化的Python实现)

Python是不是被严重高估了?由讯客互联网络资讯栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Python是不是被严重高估了?