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

发布于:2020-12-30 15:17:50

0

127

0

Python 3 迁移 Python 2

在2014年的Pycon中,Python的创建者Guido van Rossum以及当时的语言“生命的仁慈独裁者”站在一件衬衫上,上面写着大2.8的大写字母,上面有一个大红色没有进入标志。他说:“现在是进入Python 3的时候了,”他告诉听众他们应该开始在工作流程中采用该语言的新版本。 

经过核心提交者和周围的图书馆社区为实现该目标而进行的多年努力,Python 2终于寿终正寝。根据pythonclock.org的说法,2020年1月1日是支持Python 2的截止日期。 

对于几年前已经做出更改的一些公司来说,这将不是问题。但是,出于多种原因,很多公司都不会在短期内进行更改。 

对于大量使用该语言的公司,尤其是那些可能不准备迁移的公司,此更改意味着什么?为了了解正在发生的事情的整个上下文,让我们回顾一下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代码都将支持世界上的每个人,无论编写该代码的开发人员是否明确打算这样做。 

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

结果,Python 2继续处于积极的开发中。不过,在2019年,Python 3终于(大部分)成为了新Python开发的默认语言版本,许多公司和项目都在使用Python 3的主要功能:f字符串,Path,类型提示,异步和,当然是Unicode渲染。 

缓慢的采用过程

自从新的主要版本于2008年宣布以来,采用Python 3一直很漫长。Dustin显示了采用了多长时间:

{xunruicms_img_title}

最初,有很多理由不采用Python 3:最重要的是,它与Python 2并没有向后兼容。结果,主要的库都犹豫不决地迁移到平台上,这是一个自我实现的预言。 ,并且很难通过缺乏支持工具来移植代码(最终使用2to3和6这样的方法解决了)。 

转换的转折点发生在大约2016年左右的Python 3.5发行版中,该版本具有矩阵乘法,asyncio的引入,OrderedDict的速度改进以及类型提示的实现,这些提示为Python带来了一些类似于静态语言的功能。 

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

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

因此,既然我们快要结束了,那么从开发中终止Python 2对依赖它的开发人员生态系统意味着什么? 

从Internet上的状态来看,您可能以为每个人都完成了迁移。在Jetbrains进行的一项调查中,该公司生产像IntelliJ和PyCharm这样的IDE,有75%的个人受访者表示他们已经迁移了。一连串的博客文章也表明了这一点。例如,Dropbox于2018年秋季详细说明了他们的迁移。Instagram于2017年迁移。Facebook于2014年 开始。在其客户的敦促下,Splunk最近也这样做了。 

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

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

 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 DESC  LIMIT 100

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

{xunruicms_img_title}

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

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

任何给定软件的使用寿命终止通常并不意味着该软件不再可用。这确实意味着它不再针对任何安全漏洞或添加任何其他错误修复程序进行更新。规范寿命终止的Python PEP(语言规范)规定, 

此声明不能保证会定期发布错误修正,但是它应该使希望为Python 2.7贡献错误修正的志愿者能够使用,并且应该使仍然需要支持Python 2的供应商满意。

但是,不更新到Python 3会带来很多风险-最重要的是,丢失安全更新,不利用类型提示和速度提升等新功能的风险。 

为什么采用率这么慢

那么,为什么在截止日期之前我们采用率更高呢? 

在开玩笑的帖子中,我写道IT在Java 8上运行(按当今的标准,这是古老的) 

根据2018年的JVM生态系统报告, Java 8仍然是主要的开发环境。

这就是答案:大多数大型组织都在技术新闻发布的炒作周期之外,而移动的速度却比媒体或博客所想的要慢得多。例如,大多数主要银行仍在运行FORTRAN和COBOL的某些变体。 

因此,尽管许多公司概述了他们的迁移策略,但相同或更多的量将长期保留在Python 2上。为什么会这样呢? 

在阅读已经迁移人员的账目时,很容易看出:迁移代码库需要很长时间,这是一个高度政治决定,并且即使在技术含量最高的公司中,也有惯用的意图。

例如,为了在Facebook上使用Python 3,Jason Fried从2014年开始重写服务。一路走来,他犯了很多错误,更改了很多代码,并做了很多修改以使其广为人知人们正在做Facebook之类的事情,例如参加新的开发人员培训,从而开始使用Python 3。然后,他与ŁukaszLanga合作,后者将Instagram转换为Python 3:

 2016年,他和Langa在Facebook上组建了一个全新的团队,以在公司内部管理Python,他们将其称为“愚蠢的步行部”。因为他们是“ Python团队”,所以他前面提到的“公认的权威”起作用了。人们认为他们可以在Facebook上做出有关Python的决定。 

Instagram的举动本身耗时10个月。Guido和Langa现在在其中工作的Dropbox花费了三年时间,直到Guido几周前退休,该工作仍在进行中。诚然,所有这些都是巨大的代码库,但是您必须怀疑:如果Python的高层人员从事此工作需要花费这么长时间,那么对于一家正规公司来说可能要花费多长时间,也许是其中Python甚至不是主要语言的公司? 

在所有情况下,政治发挥的作用与技术指导一样重要。 

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

这将我们带到第三个原因:惯性。尽管许多版本的Linux(例如RHEL)在Python 2和Python 2之间都包括了Python 3,但这绝不是默认值,在2和3之间切换时,经常发现一些错误,尤其是指向系统版本的指针例如,在Debian上的Python 。 

Python经历了从2到3的漫漫长路,个人和具有前瞻性的初创公司都采用了它。现在,第二大迁移将发生在大型企业从2开始迁移的时候。关于Python 2,我们将看到2020年40%的数量进一步减少,但这种变化将是逐步的,并且将会有运行Python的公司2.7走向未来。