b站学python_python学习,那些B站上“优质”的课程你真的需要吗?

除了那些打着Python名头实现算法与数据结构保持头脑清醒之外,少心误入坑。其他类型的网上教程可以按需看看。

Python值得你花时间学习吗?

Python当然值的你去学习,从目前来说,除了移动领域,几乎所有信息领域都有Python的影子,尤其是人工智能、大数据分析领域,自动化运维,Python在所有语言中绝对占优势的。Python之吸引大部份人学习的它的原因是 因为Python底层的扩展库已经封装了大量的Cython、C/C++扩展库。你只需将精力花在如何实现业务逻辑,那些重做轮子繁琐复杂的算法实现和数据结构已经有众多的Cython、C/C++贡献者在Python扩展底层定制好了。

Python的短板在哪里?

学习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实现各种算法与数据结构,更甚的是一些院校还开设相关Python算法课程,请问拿一种本身在执行性能上处于劣势的语言实现的算法会令你的程序会更快吗!这更容易误导入坑学习Python的用户吗!在不同语言中实现等效的算法,原生Python写的算法几乎是不可能令人接受的。笔者认为如果你喜欢Python必须敢于面对它现在的短板。可以学习更多的CPython以外的其他Python技能,提升你的Python程序质量。

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

虽然数据结构和算法实现跟编程语言无关,但是现实中用Python语言来写算法本来就很扯蛋,因为解释语言本身每条Python语句会解释为对应的字节码。我们先来梳理一下Python代码、字节码指令、以及CPython内核函数的一些关系。你就明白用Python写算法实现是一件多么蛋痛、吃力不讨好的事情。一条Python语句等价2-4条指令字节码指令不等。

每条字节码指令实质上在CPython内核opcode.h头文件中有一个特定整数与其对应。

CPython虚拟机执行字节码指令是依靠ceval.c源文件中的一个事件主循环来不断匹配switch 控制结构每个case分支中字节码指令。

每个字节码case 分支分别静态调用了对应多条的CPython内核的C函数。那么执行一个字节码指令行最终实质上调用该字节码case分支的多条C函数。

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

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

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

那么分析那么多,笔者的观点很明确Python不适合用于算法和数据结构实现!!笔者推荐使用强类型的静态语言,例如Java、C、C++、C#等。

那些鼓吹用解释器语言写算法实现,压根就没去深刻理解CPython底层的工作原理,要么就瞎扯,要么就装逼坑新入坑的Python学员。Python更多地适用于封装并调用C/C++底层实现的各种算法接口的粘合语言,也就是它只适合写常规的业务逻辑的,并不适合作为算法实现,

我的行笔风格比较辛辣,因为笔者就看不惯那些形而上学,随商业炒作学习Python的狂热份子,笔者经常在知乎平台收到一些很无知的问题,其实笔者是要给这些无知的论调打脸。

Cython与Python的关系

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

Cython适合什么人群

其实Cython的门槛还是挺高的,需要你已经熟练掌握C/C++和Python,并对CPython内核有一定程度的了解。因此笔者不建议Python新手一上来就涉足Cython。

对于C/C++的老油条来说,Cython会得到这部分用户群体的亲睐,因为Cython项目的主要负责人Steven,已经在Cython编译器的底层大量内置了C/C++的基础库封装,并且是已经最优化的C代码封装。换句话说,你可以使用类似Python的语法加少量C/C++类型的静态语法,已经可以写出高效的C扩展代码,节省你大量重做轮子的时间成本。

Cython的性能问题

Cython兼容CPython之所以那么出色,因为Cython大量使用了CPython内部的C函数接口。Cython开源项目创立的初衷旨在与CPython交互,而非像PyPy这些第三方实现那样完全取代CPython,因此在Numba,PyPy和Cython这些Python后继实现的性能测评中,Cython往往不如Number和PyPy快的原因是因为Cython仍然是基于CPython作为后端扩展运行,和CPython的交互的过程是C原生的数据类型向上转换CPython内部数据类型的过程必然产生大量的时间开销,这不是Cython的错,是CPython拖了Cython的后腿。此时你可以考虑PyPy替换CPython作为业务逻辑的前端,而Cython作为数据运算与处理、并发响应的后端。

如果你喜欢本专题,可以点击以下传送门。Cython编程技术​www.zhihu.comv2-b6546a28845e426a25b971ce7fcab919_ipico.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值