为什么向 Python 3迁移需要这么长时间?

2019 年 12 月 18 日

为什么向 Python 3迁移需要这么长时间?

在 2014 年的 Pycon 中,Python 的发明人 Guido van Rossum 说:“现在是进入 Python 3 的时候了!” 经过核心代码贡献者和开源社区的多年努力,Python 2 终于寿终正寝了。根据 pythonclock.org 的说法,2020 年 1 月 1 日是支持 Python 2 的截止日期。对于几年前已经做出 Python3 迁移的一些公司来说,这将不是问题。但是,出于多种原因,很多公司都不会在短期内进行 Python2 迁移。


对于大量使用 Python 的公司,特别是那些近期可能不准备迁移 Python2 的公司,此更改意味着什么?要了解正在发生的事情的整个上下文,让我们回顾一下 Python 的历史。


Python 简史


开发 Python 3 的想法是实现一些重大的改变,如摆脱了 Python 的遗留问题:将所有字符串都呈现为 Unicode。正如 Python 的核心开发人员之一布雷特·坎农(Brett Cannon)写道:


人们有时会忘记 Python 诞生的年代。

Guido 于 1989 年 12 月开始对 Python 进行编码,并于 1991 年 2 月首次以开源形式发布。这意味着 Python 本身早于 1991 年 10 月发布的 Unicode 标准的第一版。在随后的几年中,Unicode 标准化后创建的语言选择使用基于 Unicode 编码字符串的实现。


支持任何语言的 Unicode 和文本非常重要。


Python 是一种世界语言,不仅是支持 ASCII 覆盖的罗马字母的语言,这就是 Python 3 在处理文本时将其默认设为“ Unicode”的原因。它保证了所有 Python 3 代码都将支持世界上的每个人,无论编写该代码的开发人员是否明确为其指定 Unicode 编码。


不幸的是,该团队假设每个人都将立即进行大的切换,并使 Python 3 向后不兼容,并将 Python 2 设置为维护分支。但是,许多人不想切换,因为正如改进的 PEP 所说,Python 3 是“相对于 Python 2 的温和的改进。”许多人并没有因为这些带来的不便而切换。当时,Python2、3 最大的区别是将 print 语句更改为 print() 函数语法,这破坏了很多 Python 2 代码。


结果,此后很多年 Python 2 还继续处于积极的开发中。


不过,在 2019 年,Python 3 终于成为了新 Python 软件工程师(大部分)开发的默认语言版本,现在许多公司和项目都在使用 Python 3 的主要功能:f- 字符串、Path、类型提示、异步,当然还包括 Unicode 编码。


缓慢的迭代过程


自从新的版本于 2008 年宣布以来,Python 3 市场份额增长一直很漫长:



最初,有很多理由不采用 Python 3:最重要的是,它与 Python 2 并没有向后兼容。结果导致一些 Python2 的主要库往 Python3 迁移都犹豫不决。2 向 3 转换的转折点发生在大约 2016 年左右的 Python 3.5 发行版中,该版本具有矩阵乘法、asyncio 的引入、OrderedDict 的速度改进以及类型提示的实现,这些提示为 Python3 带来了一些类似于静态语言的实用功能。


Python3 更高版本包含更多功能,例如 Pathlib 库和 f- 字符串操作。通过这些更改,人们使用了许多库(例如用于机器学习的 scikit-learn)开始了向 Python 3 的迁移。


随着越来越多的依赖关系开始升级,一些公司也开始迁移 Python3。


从互联网上的状况来看,您可能以为每个人都完成了 Python3 迁移。


在 Jetbrains 进行的一项调查中,他们制作了 IntelliJ 和 PyCharm 之类的 IDE,有 75%的个人受访者表示他们已经迁移到 Python3。一连串的博客文章都显示了相同的内容,例如,Dropbox 于 2018 年秋季详细说明了他们的迁移 Python3、Instagram 于 2017 年迁移 Python3、Facebook 于 2014 年开始迁移 Python3。在客户的敦促下,Splunk 最近也这样做了 – 往 Python3 迁移。


但是,仅仅因为 Python 2 即将到期,并不意味着公司会在一夜之间停止使用它。我们怎么知道 Python 2 仍在大量的使用?我们可以直接检查 Python 包库 PyPI 的运行情况。2016 年,PyPI 核心开发人员开始将日志发送到 Google 的 BigQuery,以便能够针对它们运行 SQL,这使得根据使用情况做出体系结构决策变得更加容易。


例如,如果要查看过去 30 天内通过 Python 版本下载了哪些库,则可以在 BigQuery 中创建一个新项目(每月查询的前 1TB 是免费的),然后运行:


SELECT REGEXP_EXTRACT(details.python, r"^([^\.]+\.[^\.]+)") as python_version, COUNT(*) as download_count,FROM TABLE_DATE_RANGE(  [the-psf:pypi.downloads],  DATE_ADD(CURRENT_TIMESTAMP(), -31, "day"),  DATE_ADD(CURRENT_TIMESTAMP(), -1, "day") )GROUP BY python_version,ORDER BY download_count DESCLIMIT 100
复制代码


尽管 Python 3 一直是社区中的主导版本至少一年,但从 PyPI 下载的单个软件包的最新数量显示,2019 年 9 月所有软件包下载中至少有 40%为 2.7 版本。诚然,这比年初的 60%有所下降,但是鉴于 EOL 距离只有数月之遥,所以这个数据仍然很重要。



在每个库的基础上,它变得有些棘手:大多数 Flask 下载都是使用 Python 3 版本完成的,但是只有 26%的 botocore 下载(适用于 Python 的 AWS 开发工具包)正在使用 Python 3。


而且,有几个库需要进行迁移:Twisted 和 PyPy(常用的 JIT 编译器)将无限期保留版本 2。


任何给定软件的寿命终止通常并不意味着该软件不再可用。这确实意味着它不再针对任何安全漏洞或添加任何其他错误修复程序进行更新。但是,不更新到 Python 3 会带来很多风险 - 最重要的是,可能会丢失安全更新,无法利用类型提示和速度提升等新功能。


为什么 Python3 迁移速度这么慢?


开个玩笑,在我写本文的时候,我的 IT 系统还在 Java 8 上运行(按今天的标准,这已经很古老了。但是根据 2018 年的 JVM 生态系统报告,Java 8 仍然是主要的开发环境。)


这就是答案:大多数大型组织,在技术新闻发布的炒作周期之外,其行动要比新闻媒体或博客想像的要慢得多。例如,大多数主要银行仍在运行 FORTRAN 和 COBOL 的编程语言系统。


因此,尽管许多公司描述了他们的迁移策略,但更多的应用软件将长期保留在 Python 2 上。


为什么会这样呢?


在所有决策中,政治发挥的作用和技术指导一样重要


例如,为了在 Facebook 上使用 Python 3,Jason Fried 从 2014 年开始重写 Python3 服务。一路走来,他犯了很多错误,更改了很多代码,并做了很多修改以使其广为人知人们正在做 Facebook 之类的事情,例如参加新的开发人员培训,从而开始使用 Python 3。然后,他与ŁukaszLanga 合作,后者将 Instagram 转换为 Python 3: 2016 年,他和 Langa 在 Facebook 上组建了一个全新的团队,以在公司内部管理 Python3。由于他们是“ Python 团队”,因此他先前提到的“公认权威”起作用。人们认为他们可以在 Facebook 上做出有关 Python 的决定。实际上,Instagram 的迁移项目本身耗时 10 个月。


Guido 和 Langa 现在工作的 Dropbox 花费了三年时间,而直到 Guido 几周前退休为止,它仍在进行中。


诚然,上面这些案例都是巨大的 Python 代码库,但您必须怀疑:如果 Python 的高层人员从事此工作需要花费这么长时间,那么对于一家公司非高层做决策来说可能要花费更多的时间。


安全问题是一个很重要的考量问题


具有讽刺意味的是,您会认为不升级将是更大的风险。但是在较大的组织中,不允许升级 Python3:管理员或安全团队向他们推送更新。在某些情况下,也不允许下载更新 PIP。如果 Python 2 是安全团队同意的默认协议,那么它可能需要做出巨大的努力才能说服人们将其切换到 3,尤其是在受到严格监管(例如医疗保健或金融)和政府的 IT 环境中。


惯性


尽管许多版本的 Linux(例如 RHEL)在 Python 2 和 Python 3 之间都包括了 Python 3,但这绝不是默认值,在 2 和 3 之间切换时,经常发现一些问题,尤其是指向系统版本的链接默认使用 Python2。Python 经历了从 2 到 3 的漫漫长路,个人和具有前瞻性的创业公司都采用了它。现在,第二大迁移将发生在大型企业从 2 开始迁移的时候。关于 Python 2,我们将看到 2020 年 40%使用率的数量进一步减少,但是变化将是递增的。


英文原文


Why is the Migration to Python 3 Taking So Long?


2019 年 12 月 18 日 15:424969
用户头像
小智 InfoQ 主编

发布了 395 篇内容, 共 306.8 次阅读, 收获喜欢 1709 次。

关注

评论 1 条评论

发布
用户头像
其实更直接的原因是在AI火起来之前,Python远没有这么多使用者,也没有这么多关注,当时发展速度慢是正常的。
2019 年 12 月 28 日 20:51
回复
没有更多评论了
发现更多内容

一致性哈希实现

娄江国

极客大学架构师训练营

IOTA架构实战:大数据即时多维查询引擎构建【视频】

易观大数据

架构模式 大数据任务调度 查询引擎 数据算法

UC Token即将强势登陆

Geek_116789

高性能系统设计

dapaul

极客大学架构师训练营

架构师训练营-第五周-命题作业

sljoai

极客大学架构师训练营 第五周

架构师训练第五周

邵帅

面试官:为什么 HashMap 的加载因子是0.75?

哪吒来踢毽子

hashmap

分布式缓存 - 第五周总结

孙志平

漫画:Integer 竟然有 6 种比较方式?

王磊

Java 编程 漫画 java编程 漫画编程

B站Up主自制秃头生成器,一键get张东升同款发型,网友:秃的太过真实

程序员生活志

程序员 B站 隐秘的角落 张东升 秃头生成器

华为厦门DevCloud创新中心正式揭牌,“上云用数赋智”新助力

Geek_116789

分布式缓存总结

朱月俊

视读——沟通的艺术,看入人里,看出人外(第一章)

双儿么么哒

读书笔记 视觉笔记

缓存、一致性哈希和负载均衡总结(训练营第五课)

看山是山

缓存 极客大学架构师训练营 一致性hash

架构师训练营第五周作业 一致性哈希

sunnywhy

架构师训练营第 5 周作业——一致性Hash算法

在野

极客大学架构师训练营

第五周总结

Acker飏

极客大学架构师训练营

嗯?阿里为啥不用 ZooKeeper 做服务发现?

Java小咖秀

zookeeper 分布式 技术人生

可变对象和不可变对象

Leetao

Python Python基础知识

架构师课程第五周总结

dongge

Tomcat 架构原理解析到架构设计借鉴

码哥字节

Tomccat 「Java 25周年」

架构师训练营第五周作业 设计分布式缓存系统

Melo

极客大学架构师训练营

第5周作业

田振宇

真懂Spring的@Configuration配置类?你可能自我感觉太良好

YourBatman

Spring Boot Spring Framework @Configuration Spring配置类

架构师训练第五周一致性Hash

邵帅

第五次作业

王锟

一致性hash算法及java实现(转载,学习了)

王锟

重学 Java 设计模式:实战模版模式「模拟爬虫各类电商商品,生成营销推广海报场景」

小傅哥

Java 设计模式 小傅哥 重构 代码规范

小师妹学JVM之:JVM中的Safepoints

程序那些事

Java JVM 小师妹 性能调优 GC

ES5、ES6中继承的几种写法

Manito

Java

第五周总结

秦宝齐

课程作业

为什么向 Python 3迁移需要这么长时间?-InfoQ