共计 6609 个字符,预计需要花费 17 分钟才能阅读完成。
作者 | 宋天龙
来源 | AI 科技大本营
导语:一切都始于 1989 年的那个圣诞节,Python 的诞生并不算恰逢其时,它崛起充满了机遇巧合,也有其必然性。三十年间,Python 技术不断更迭,生态逐渐完善,加上互联网、大数据、以及人工智能这一波波浪潮的推波助澜,Python 渐渐从小众最终站上了现在的高度。
从历史发展的角度出发,我们才能看清 Python 崛起的偶然性和必然性。本文将结合技术和产业的发展,全面透析 Python 的演进之路,帮助读者理解是什么造就了如今的 Python。
Python 1.0 时代:起源与诞生
Guido van Rossum(下面简称 Guido)是 Python 语言之父,他于 1982 年从阿姆斯特丹大学获得了数学和计算机硕士双学位,期间他接触了很多的语言,包括 Pascal,C,Fortran 等。
在那个计算机资源贫乏的年代,像计算机一样思考并编程是每个程序员必须面对的事情,这让他非常苦恼;同时他又非常欣赏 shell,shell 简单易编程的特性让程序员更加专注于设计和逻辑本身,但 shell 本质上是一个功能的调用,它没有自己的数据类型,更无法全面调用计算机功能,因此 shell 也不算是一门“语言”。
因此,他希望找到一种语言既可以像使用 shell 一样简单,又可以和 C 语言的功能相媲美。不过这种语言在那个年代并不存在。
1989 年的圣诞节,Guido 开始编写 Python 语言的编译器。Python 这个名字来源于他喜欢的电视剧 Monty Python’s Flying Circus,而不是表面意义上的“蟒蛇”。他希望这个新的语言,能符合他的理想:介于 C 和 shell 之间,功能全面、易学、易用又可拓展。
1991 年,第一个 Python 编译器诞生,这标志着 Python 的第一个版本正式诞生。它基于 C 语言,并具备了基础的类、函数、异常处理等功能特性,同时具备可扩展性。Python 语法很多来自 C,但又受到 ABC 语言的强烈影响。例如来源于 ABC 语言强制缩进的规定本身可以让 Python 容易读,但如果缩进出错却会影响编译和执行。Python 本身不以性能为重,但当确实需要考虑性能时,Python 程序员却可以深入底层来编写 C 程序,并编译为.so 文件引入到 Python 中使用。
Python 语言的魅力在于让程序员可以花更多的时间用于思考程序的逻辑,而不是具体的实现细节,这一特性也得到 Guido 同事的欢迎。他们在反馈使用意见的同时也参与到 Python 的改进中来,因此最初 Guido 和一些同事构成了 Python 的核心团队,当然,核心决策者还是 Guido 本人。随后,Python 的使用拓展到研究所之外,并吸引了越来越多的程序员。
但是,最初 Python 的使用非常小众,因为在那个计算机资源非常有限的年代,大家都倾向于最大化榨取计算机资源并提升运算效率,而 Python 显然不是为此而生。
Python 2.0 时代:崛起
最初发布时,Python 在设计层面存在一些缺陷,例如以满足跨语言、跨平台进行文本转换、处理的要求的 Unicode 字符编码标准在 1994 年才正式公布,所以一直以来 Python 2 及之前的版本对 Unicode 的支持并不完全。相信大家在使用 Python 2 版本处理中文时都遇到过各种问题。
2000 年发布的 Python 2.0 标志着 Python 的框架基本确定。重要框架方向包括:
- 简单明确。在设计 Python 语言时,开发者倾向于选择没有或者很少有歧义的语法。由于这种设计观念的差异,Python 源代码通常被认为比 Perl 具备更好的可读性,并且能够支撑大规模的软件开发。
- 面向对象。任何 Python 的元素都可以视为对象,包括数据类型、类、函数、实例化元素等,完全支持继承、重载关系,这有益于增强代码的复用性。
- 动态类型。任何对象的数据类型都无需提前定义,拿来即用。即使在之前已经预先定义,后期也可随时修改。
- 胶水特性。Python 本身被设计为可扩充的,并非所有的特性和功能都集成到语言核心。Python 提供了丰富的 API 和工具,以便程序员能够轻松地使用 C、C++、Cython 来编写扩充模块。例如在 Google 对于 Google Engine 使用 C ++ 编写性能要求极高的部分,然后用 Python 或 Java/Go 调用相应的模块。
- 可嵌入。你可以把 Python 的功能嵌入到 C /C++ 程序中,从而实现 Python 功能在其他语言中的功能实现。
- 生态系统。Python 有强大的标准库,同时支持第三方库和包的扩展应用,甚至可以自定义任何库和包。Pypi(https://pypi.org/)是其第三方库的仓库,在这里你几乎可以找到任何领域内的功能库。
- 解释器机制。Python 支持多种解释器,例如 CPython(官方版本,基于 C 语言开发,也是使用最广的 Python 解释器)、IPython(基于 CPython 之上的一个交互式解释器)、PyPy(一个追求执行速度的 Python 解释器,采用 JIT 技术对 Python 代码进行动态编译)、Jython(运行在 Java 平台上的 Python 解释器,可以直接把 Python 代码编译成 Java 字节码执行)、IronPython(和 Jython 类似,只不过运行在微软.Net 平台上)。
1965 年,戈登·摩尔提出了著名的摩尔定律,其内容为:当价格不变时,集成电路上可容纳的元器件的数目,约每隔 18-24 个月便会增加一倍,性能也将提升一倍。在随后超过半个世纪的时间里,个人计算机的发展日新月异,已经由资源不足向资源过剩转变。这客观上为 Python 的应用提供了基础条件——只有在资源过剩的条件下,程序员才不会过度关注榨取性能。
随着 Python 自身功能的完善以及生态系统的扩展,Python 在 Web 开发、网络爬虫、数据分析与数据挖掘、人工智能等应用方面逐渐崭露头角。
Django 和 Flask 引领的 WEB 开发模式
2004 年,目前最流行的 WEB 框架 Django 诞生。2010 年,另一个流行的轻量级 WEB 框架 Flask 诞生。Django 是一个 WEB 解决方案“全家桶”,其功能大而全,包含了几乎所有 WEB 开发相关的组件和功能,它可以大大节省开发者在基础组件、选型、适配等方面的时间和精力;而 Flask 只包含基本的配置,默认依赖于两个外部库也可以自由替换,给开发者提供最大的自主空间。这两类完全相反方向上的 WEB 开发模式,几乎可以为所有开发者提供了很好的选型参照物:无论开发者想要一站式还是最大化自主解决方案,Python 都能满足。
此后,以豆瓣、春雨医生、知乎、Dropbox、YouTube、CIA(美国中情局)等为代表的企业和机构都基于 Python 做网站开发,预示着 Python 应用到 WEB 开发领域逐渐成为一种新兴趋势。
人人都能胜任的网络爬虫
Python 自带的标准库中,urllib、urllib2、requests 库对于简单网页的抓取实现非常简单,即使在面对海量数据抓取需求时,第三方库 Scrapy 也能应对自如;再配合正则表达式库 re、网页代码解析 BeautifulSoup、html 和 xml 解析库 lxml、多线程库 threading 等特性,使得 Python 在应用到网络爬虫任务上时,只需要很少的开发量便能迅速完成任务。基于 Python 简单易学的特性,几乎人人都能开发网络爬虫。
比 shell 更好用的自动化运维工具
Python 是跨语言和平台的,几乎所有 Linux 系统和 MAC 系统都自带 Python 库,Windows 系统也可以自定义安装。Python 默认的 os、sys 等库可实现与操作系统的交互和执行功能,更重要的是 Python 还能直接执行系统终端命令。因此,使用 Python 编写的系统运维和管理脚本在可读性、性能、代码重用度、扩展性几方面都优于普通的 shell 脚本,在自动化运维方面应用广泛。
数据分析与科学计算三剑客
2008 年发布的 Numpy、scipy 和 2009 年发布的 pandas 是数据分析与科学计算的三剑客。
NumPy(Numeric Python 的简称)是 Python 科学计算的基础工具包,也是 Python 做数据计算的关键库之一,同时又是很多第三方库的依赖库。
Scipy(Scientific Computing Tools for Python 的简称)是一组专门解决科学和工程计算不同场景的主题工具包,它提供的主要功能侧重于数学、函数等,例如积分和微分方程求解。Pandas(Python Data Analysis Library 的简称)是一个用于 Python 数据分析的库,它的主要作用是进行数据分析和预处理。
Pandas 提供用于进行结构化数据分析的二维表格型数据结构 DataFrame,类似于 R 中的数据框,能提供类似于数据库中的切片、切块、聚合、选择子集等精细化操作,为数据分析提供便捷。另外,Pandas 还提供了时间序列的功能,用于金融行业的数据分析。
除此之外,很多大型公司也都在使用 Python 完成不同类型的其他工作,其中不乏世界知名公司,如国外的 Google、Facebook、NASA、雅虎、YouTube 等,国内的网易、腾讯、搜狐、金山等。例如谷歌在 Google Groups、Gmail、Google Maps 等项目中将 Python 用作网络应用的后端;在 Google Cloud Platform 中的 Google Cloud Storage 本地部署环境中,gsutil 也在 Python 2 基础上开发和应用。
后 Python2 与 Python3 时代:AI 让 Python 大放异彩
2008 年 12 月,Python 3 发布。Python 3 相对于 Python 2 的早期版本(主要是 Python2.6 之前)是一个较大的升级,它在设计的时候没有考虑向下兼容,所以很多早期版本的 Python 程序无法在 Python 3 上运行。为了照顾早期的版本,推出过渡版本 2.6——基本使用了 Python 2.x 的语法和库,同时考虑了向 Python 3.0 的迁移,允许使用部分 Python 3.0 的语法与函数。同时,Python 还提供了 Python 2 到 Python 3 的 Python 文件转换功能,以帮助开发者升级。
2010 年 7 月发布了 Python 2.x 系列的最后一个版本,主版本号为 2.7。大量 Python 3 的特性被反向迁移到了 Python 2.7,2.7 版本比 2.6 版本进步非常多,同时拥有大量 Python 3 中的特性和库,并且照顾了原有的 Python 开发人群。Python2.7 也是当前绝大多数 Linux 操作系统最新版本的默认 Python 版本。
从 2008 年开始,Python 2 与 Python 3 是并存发展的。但在 2018 年 3 月,Guido 在邮件列表上宣布 Python 2.7 将于 2020 年 1 月 1 日终止支持,这意味着之后 Python 2 将不再被统一维护,与之对应的是主流第三方库也不会再提供针对 Python 2 版本的开发支持。Python 2 的时代即将过去。
这一时期,Python 继续以其独特魅力吸引更多的开发者加入,但真正让 Python 大放异彩的却是 AI(人工智能)的爆发。
AI 并不是一个新生事物,而是从 20 世纪 50 年代就开始出现,随后经过了大概 20 年的黄金时期,又分别在 20 世纪 70 年代和 90 年代两次进入寒冬期。从 2006 年开始,神经网络、深度学习的出现,让 AI 进入爆发期。
在 AI 领域,Python 拥有很多相关库和框架。其中最著名的是:
- sklearn:一个老牌机器学习库,其 neural_network 库可用来做神经网络训练。
- PyTorch:由 Facebook 于 2016 年发布,它基于曾经非常流行的 Torch 框架而来,为深度学习的普及迈出了重要一步,到目前为止它已经是人们用来做学术研究的首选方案。
- TensorFlow:谷歌于 2015 年研发的第二代人工智能学习系统。借助谷歌的强大号召力以及在人工智能领域的技术实力,它已经成为目前企业真实生产环境中最流行的开源 AI 框架。更重要的是,它也是第一个(应该也是唯一一个)经过真实大规模生产环境(Google)检验过的框架。
在互联网领域,Facebook 和 Google 都是全球 IT 企业的标杆,具备行业领导力和风向指示意义。他们基于 Python 开发的 AI 库(PyTorch 和 TensorFlow)已经成为目前最流行的 AI 库,而且“到底选择 PyTorch 还是 Tensorflow”仍然是一个具有争议性的话题。
在 AI 时代,主要应用场景包括:
- 计算机视觉:通过特定的图片模式训练,让计算机理解图像中的物体甚至内容。在这一领域我们熟悉的场景包括图像识别、目标识别和跟踪。例如人脸识别便是图像识别的典型领域,广泛应用到企业员工考勤、门店客户识别、机场等公共领域反恐识别等。2011 年,吴恩达创立的谷歌大脑项目,能够在没有任何先验知识的情况下,仅仅通过观看无标注视频学习到识别高级别的概念就能知道哪个是猫。
- 语音识别:该过程是计算机将人类的自然语言识别并转换为文字的过程,广泛应用工业、家电、通信、汽车电子、医疗、家庭服务、消费电子产品等各个领域。身边熟悉的场景例如通过语言对导航、APP、车载设备等做指令输入,以及电信客服系统中的语音业务查询和办理。
- 自然语言理解:自然语言理解是一类任务的总称,而并非是单一任务。它旨在让计算机理解人类的语言所表达的表层和深层含义。目前场见的应用场景包括自动问答系统、机器翻译、信息检索和过滤、信息抽取等。
- 个性化推荐:个性化推荐是一个相对成熟的领域,但基于深度学习和神经网络,可以将大量的复杂、抽象特征的数据预处理工作最大程度的简化,甚至可以将海量特征经过简单处理后便直接丢到模型中便能获得比例理想的效果。
- 游戏和竞技:在该领域,很多科技公司用经过训练后的 AI 与人类进行对弈。早在 20 世纪 90 年代,由 IBM 开发的“深蓝”与卡斯帕罗夫的世纪之战已经引起了世界的轰动;在 2017 年 AlphaGo 又击败排名世界围棋冠军柯洁,再一次让世人感受到 AI 的强大威力。
在不同的领域,Python 都能扮演非常重要的角色,因此,在国外的各大榜单中,Python 都已经成为最受欢迎的语言(或至少是之一)。不只在商业领域流行,国内很多地区和教育机构正将 Python 纳入教材之中。比如 Python 进入山东小学六年级的教材,浙江信息技术教材将放弃 VB,改用 Python 语言,Python 列入全国计算机二级等级考试大纲等。
Python 的未来发展
在 Python 发展过程中,Guido 一直是核心人物,甚至被称为“终身仁慈独裁者”,但在 2018 年经历了退出管理层风波之后,他又在 2019 年以五大指导委员之一的身份重回决策层。这为 Python 迎来了新的治理方案:指导委员会模式。这种模式意味着 Python 的未来将从 Guido 一人决定变为 5 人决定,虽然比很多开源语言仍然有民主化空间(例如 PHP 的改进由社区投票决定),但也算是一种从专制到民主的进步。
有关 Python 的每个提升计划,都是在 PEP(Python Enhancement Proposal)列表中——每个版本新特性和变化都通过 PEP 提案经过社区决策层讨论、投票决议,最终才有我们看到的功能。
目前,Python 的最新稳定的主版本是 3.7,Python 3.8 也已经有了预览版,大概在 2023 年左右 Python 4 便会问世。在之后的时间里,Python 会如何发展?我们可以从 Python 软件基金会的董事会成员、CPython 的核心开发人员 Nick Coghlan 的信息中略知一二:
首先,Python 的 PEP 流程和制度没有任何变化,通过增加新模块和功能来增强的基础能力。随着 Python 2 在 2020 年不再维护,社区在 Python 3 的资源和投入会相应增加。
其次,不同解释器的实现和功能扩展还将继续增强,方向包括 PyPy 关于 JIT 编译器生成和软件事务内存的尝试,以及科学和数据分析社区,对面向数组编程的探索等。
再次,嵌入式应用的增强,核心是与其他虚拟机运行时(如 JVM 和 CLR)的集成和改进,尤其是在教育领域取得的进展,可能会让 Python 作为更受欢迎的嵌入式脚本语言,在更大的应用程序中运行。
最后,对于为了兼容和维持 Python 2 的部分功能而存在于 Python 3 中的原有代码,在后续版本中应该会逐步优化甚至去掉。而对于其他更改,则会根据情况弃用、提出警告、逐步替代以及保留。