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

135 篇文章 1 订阅
133 篇文章 0 订阅

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语言实现的,那会有人跟我杆以下这个问题。

 最后

为了帮助大家更好的学习Python,小编给大家准备了一份Python学习资料,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂,需要获取方式:扫描下方即可获取。

👉Python学习路线汇总

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

👉Python必备开发工具👈

👉精品Python学习书籍👈

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

温馨提示:篇幅有限,已打包文件夹,获取方式:点击这里【 Python全套资料】 或扫描下方即可获取。

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

​​​

👉100道Python练习题👈

​​​

👉面试刷题👈

​​​

​​​

👉实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

​​​

获取方式:点击这里【 Python全套资料】 或扫描下方即可获取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值