网易首页 > 网易号 > 正文 申请入驻

Python 2还能走多远?

0
分享至

作者:cunshun

丨 导语 自2020年Python 2停止维护至今,5年过去了。虽然还有很多项目依旧在使用Python 2,但不可否认,无论是企业还是社区,都在努力向Python 3迈进。Python 2简洁易读、灵活易上手、支持库丰富,但随着大规模使用,亦逐渐暴露出各种不足。尤其是近些年Python维护者们通过持续补丁对Python 2进行优化和修复,但其底层架构和实现上的问题依然无法完全解决。为什么要升级到Python 3?如何在TencentOS Server 4中进行升级?

最近在做TS4的升级工作,遇到比较多的问题是:

1.Python2不能用了吗?

2.Python3有啥好处,为啥要升?

3.有没有什么方法一键升级到Python3?

这里在开头先简单统一回答一下:

1.Python2停止维护后积累很多的安全漏洞、bug,官方也不再修复,存在严重的使用风险,不建议继续使用。

2.升级 Python3 可以获得更全更新的模块支持、更强的性能、更好的编程语法、更长的维护保障等等。

3.没有一键升级的办法,简单的python代码或许可以,复杂一点的项目需要搭配多种手段来适配。

接下来我们针对上面的问题,具体展开。


一、Python 2 的前世
1.1 Python 2的发布

在 Python 2 之前,还有一个在 1991 年 2 月 发布的 Python 0 和 在1994 年 1 月发布的 Python 1。
一些核心功能在Python0 上已经具备,例如异常处理、函数的类以及各种核心数据类型,如listdictstr等等。

Van Rossum first published the code (for Python version 0.9.1) to alt.sources in February 1991. Several features of the language were already present at this stage, among them , exception handling, functions, and various core such aslist,dict, andstr. The initial release also contained a borrowed from ; Van Rossum describes the module as "one of Python's major programming units". Python's exception model also resembled Modula-3's, with the addition of anelseclause. In 1994 comp.lang.python, the primary for Python, was formed.

Python1,又加入了一些函数式编程工具lambdamapfilterreduce的功能。

Python reached version 1.0 in January 1994. The major new features included in this release were the functional programming toolslambda,map,filterandreduce. Van Rossum stated that "Python acquired lambda, reduce(), filter() and map(), courtesy of a hacker who missed them and submitted working ".

Python2,在2000年10月发布,从此一个持续了20年的版本帝国拉起帷幕。

Python 2.0, released October 2000, introduced , a feature borrowed from the languages and . Python's syntax for this construct is very similar to Haskell's, apart from Haskell's preference for characters and Python's preference for alphabetic keywords. Python 2.0 also introduced a garbage collector able to collect reference cycles.

1.2 Python 2的演进

下面这个表展示了整个Python的版本发布历程,看到每个版本发布的间隔和到终止维护基本上在5年内,但是只有最后一个2.7版本,在2010年发布,又继续维护了10年之久,甚至很多人都觉得Python2会一直维护下去。

看下面这张图时间线更清楚一点。python2.7很长一段时间内和python3共存,所以这段时期在各大主流发行版中,都会同时提供 Python2 和 Python3 两个Python版本。


二、Python 2 的今生
2.1 Python 2 的最后一舞

Python2官方一开始宣布在2020年1月1日停止维护。

但是后来PSF将Python2的实际停用时间更新为2020年4月。

这一举措引起了一些Python使用者的不满,甚至发起了请愿,要求取消2.7.18版本的发布。

后来官方解释的说法是2.7.18的代码仓在2020.1.1已经被冻结,但是版本发布在4月:)。

不管怎样,这个巨无霸版本最终还是在2020年落下帷幕,2.7.18,作为Python2的最后一个版本,在2020年4月发布,同月,Python2.7的维护者在2020年4月发布一封邮件,正式和Python2道别,并呼吁开发者从Python2迁移到Python3.

PSF官网也发布Python2停止维护的公告:

2.2 大势所趋?

虽然社区呼吁大家切换到Python3,那实际情况是什么样子呢?Python官方给出了一些项目的Python使用时间线。

在Python公布出来的一些项目名单中,可以看到很多项目(sphinx, pillow,pandas,numpy,apache spark等),在20年后的新版本,就不再支持python2,而仅支持Python3了(绿色表示兼容python2,蓝色表示只支持python3)。包括后续新增的项目,都会优先基于python3来构建。

提示:更多项目宣布后续会不再支持python2:


三、Python 2不能用了吗?

Python2已经挺好了,为什么还要造一个差别这么大的Python3?我的项目在Python2上跑的好好的,为什么要费劲巴拉地适配Python3?

估计大多数人都会有上面这些疑问,Python维护者们也知道要让开发者从2切到3,就必须解释这些问题,如果有时间,大家可以去看看Python维护者们针对 Python3 存在的一些文章和邮件,里面有很多细节。这里主要列出几个普通开发者遇到最多的问题:

3.1 Python 2 的文本和二进制处理混乱

Python2中的 str 同时承担了 “文本”和“字节”两种语义,才导致了 Python 3 的改进:明确区分文本(str)和字节(bytes)。
例如下面这个字符串,在Python3里,他只是表示由“a”、“b”、“c”和“d”组成的字符串。

'abcd'

但是在Python2里他却可能是代表 97、98、99 和 100 的字节,所以在Python2里,你既可以把他当字节用也可以把他当字符串用,很容易出错。但是在Python3中,做了严格的区分,这样就可以保证代码中使用不会出现问题。

操作

Python2行为

Python3行为

'abcd' + 'efg'

合法,结果是'abcd' + 'efg'

合法,结果是'abcd' + 'efg'

'abcd' + b'efg'

合法,结果是'abcd' + 'efg'

报错,类型不兼容

b'abcd'

等价于'abcd'

bytes类型

3.2 Python 2 对Unicode支持不足

从上面的python版本生命线可以看到,python在1991年2月第一次发布,早于 。
所以Python2开始只支持ASCII,后续才加入了对Unicode的支持。这就导致在Python2里面处理Unicode比较麻烦,你要处理中文、日文等非 ASCII 字符,必须用unicode类型,并且要手动编码/解码,一不留神就会出错。

# Python 2  s = '你好'  # 这是utf-8编码的字节串,不是Unicode字符串  print(type(s))  #   print(s)        # 可能乱码,或者报错  # 正确做法  u = u'你好'     # Unicode字符串  print(type(u))  #   print(u)        # 正常显示

下面是一个demo,展示了Python2里面如何对字符串进行编解码。

# 假设 s = '中文',文件头声明了 utf-8  s = '中文'              # s 是 str 类型,utf-8 编码的字节串  u = s.decode('utf-8')   # u 是 unicode 类型  print(type(u))          #   # 反过来  s2 = u.encode('utf-8')  # s2 是 str 类型  print(type(s2))         #

参考:


四、Python 3有啥好处?
4.1 Python 3的优化

Python3,在性能方面做了很多改进,下面列出了其中一些。

  1. 对象的__dict__共享键存储(PEP 412, Python 3.3)

  • 多个同类型对象的__dict__(属性字典)可以共享键的存储空间。

  • 优点:当你创建大量自定义对象时,节省内存并提升访问速度。

OrderedDict用 C 实现(Python 3.5)

  • collections.OrderedDict由纯 Python 实现变为 C 实现。

  • 优点:性能提升 4 到 100 倍,插入和遍历更快。

GIL(全局解释器锁)行为更可预测(Python 3.2)

  • 旧版 GIL 按 Python 字节码数让出控制权,耗时不稳定。

  • 新版 GIL 按时间片(默认5ms)让出控制权,线程调度更公平、可预测。

io库用 C 重写(Python 3.1)

  • Python 2.7 的io库是纯 Python 实现,Python 3.1 起用 C 实现。

  • 优点:文件和流的读写操作更快。

参考:
4.2 业内的应用实例

同时,业内已经有不少企业通过 Python2 切换到 Python3 获得了性能和资源利用上的提升。例如Instagram,通过适配Python3,获得了 12% CPU 性能提升以及 30% 的内存节省效果。

数据来源:

4.3 benchmark实测

Python 官方在版本发布时,会对 Python 版本进行性能测试:

Python 3.11 的速度比 Python 3.10 快 10-60%。在平均状况下,在标准基准测试(standard benchmark suite)中可见1.25倍的加速效果。

虽然实际到业务环境中的性能提升可能没有 benchmark 提升那么大(受代码影响),但是在数据上一定是Python3的性能表现更好。

我们也基于一些Python常用软件跑了benchmark测试套,结果显示单纯基础性能 Python3 也比 Python2 要强很多。

TS4(TencentOS Server 4) 搭载了新版本 Python3,而 TS2(TencentOS Server 2) 则还是使用 Python2

4.4 更多、更好的模块支持

除了上面提到一些老组件后续不会支持python2,只支持python3之外。因为近两年AI势头兴起,AI相关的组件Python占大头,这些Python组件大部分也只支持Python3。

Pytorch

例如Pytorch,可以看到Pytorch不仅标注了需要Python3.9以上版本,并且也在删除了原来的python2兼容代码:

# pytorch If you are installing from source, you will need: - Python 3.9 or later

vllm

包括vllm也只支持Python3。

[project] name = "vllm" ... classifiers = [     "Programming Language :: Python :: 3.9",     "Programming Language :: Python :: 3.10",     "Programming Language :: Python :: 3.11",     "Programming Language :: Python :: 3.12", ... ] requires-python = ">=3.9,<3.13" dynamic = [ "version", "dependencies", "optional-dependencies"]

五、如何切换到Python 3
5.1 python 2项目适配到python 3的方法(推荐)

  • python2移植python3指南:

  • python2兼容python3工具:

  • python2->python3转化工具:

    上面提到的 modernize 工具,一样也有从将代码从python2自动转化为python3的功能,只是后者会偏向于做一些能够兼容python2的修改。

  • 格式和错误检查:

  • 类型检查:

  • 测试套:
    因为工具转化不是100%覆盖,所以可能还需要一定的测试用例保证功能正常
    可以用pytest等测试用例来进一步保证代码正常

迁移思路:

  1. 如果决心迁移到Python3,可以好好看一遍Python2->Python3的指南,然后再通过2to3/modernize转换,转换之后通过ruff/pyright工具进行二次确认检查,最后运行自己的测试代码保证功能正常。

  2. 如果还是想先用Python2过渡,可以通过python-six工具兼容一些Python2和Python3之间的不兼容库接口。

5.2 TS 4上安装运行Python迁移工具

TencentOS Server 4下运行含有python2语法的代码会报错,下面的链接中的教程可以将python2的代码转化为python3

其中2to3这个命令在TencentOS Server 4中由 python3-devel 提供,要使用该命令需要安装此包。

dnf install python3-devel -y

六、尾声

来自本文作者的话

其实新旧版本更替,是所有软件的必经之路。我们在开发TencentOS Server 4发行版时,也经历了类似的历程

从2000年到2020年这20年间,正是互联网爆发式发展的时期。数以万计的项目看中了Python简洁易读、灵活易上手、支持库丰富的特点,选择基于Python构建开发。许多大公司也积累了大量的Python代码。作为这个时代的产物,Python 2被广泛使用,甚至伴随了许多Python开发者的职业生涯。

随着大规模的应用,Python维护者意识到了 Python2 本身的一些不足,虽然在近20年的时间里一直通过补丁的方式来对Python2的进行优化修补,但是底层架构和实现上的问题难以彻底解决的。所以Python维护者们依然决定开启新的Python项目,来从根本上解决这些问题。

正是因为软件飞速发展,老版本系统存在一些从根本上无法解决的问题,可能是软件本身,也可能是一些政治经济上的原因,所以才会有版本升级的存在。业务一旦跑起来就不想升级很正常,但是在技术更迭的大潮流下,不断更新接纳新的事物也是业务能持续发展的立身之本,毕竟谁都不想做那个被拍在沙滩上的人是吧。

其他参考:

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
流传绯闻22年,杨紫和张一山终于正面回应,双方家长都见过了

流传绯闻22年,杨紫和张一山终于正面回应,双方家长都见过了

手工制作阿歼
2026-05-15 07:25:02
卸磨杀驴的结果!文胖:詹皇愿去别队拿中产,也不愿降薪3000万

卸磨杀驴的结果!文胖:詹皇愿去别队拿中产,也不愿降薪3000万

钱说体育
2026-05-15 09:05:10
方媛深夜发声:善良不必委屈自己!录陆综掀单人房之乱…贴文秒删

方媛深夜发声:善良不必委屈自己!录陆综掀单人房之乱…贴文秒删

ETtoday星光云
2026-05-15 10:02:23
从“基本盘”的词义变迁观察爱国舆论

从“基本盘”的词义变迁观察爱国舆论

知止堂上
2026-05-14 20:19:51
光地皮就值2个亿的美国驻华大使馆,为何修成一座封闭式碉堡?

光地皮就值2个亿的美国驻华大使馆,为何修成一座封闭式碉堡?

贱议你读史
2026-05-07 14:58:39
美三大养老金联名致信马斯克:反对SpaceX治理结构 管理层权力过大

美三大养老金联名致信马斯克:反对SpaceX治理结构 管理层权力过大

财联社
2026-05-14 17:22:10
绿营慌了,特朗普不提台湾议题,沈富雄闻到了风声,骂赵少康自保

绿营慌了,特朗普不提台湾议题,沈富雄闻到了风声,骂赵少康自保

陈意小可爱
2026-05-15 09:35:06
为什么比亚迪越来越像“工业怪兽”,而吉利越来越像“中国大众”

为什么比亚迪越来越像“工业怪兽”,而吉利越来越像“中国大众”

别让往昔的悲伤和对未来的恐惧
2026-05-13 16:03:22
广东男篮告别王少杰 徐昕将进行NBA级特训 多队有意请米切尔执教

广东男篮告别王少杰 徐昕将进行NBA级特训 多队有意请米切尔执教

中国篮坛快讯
2026-05-15 06:30:06
德尚:洛里没入选?他从来没考虑过当三门,因为他从来没当过

德尚:洛里没入选?他从来没考虑过当三门,因为他从来没当过

懂球帝
2026-05-15 07:25:08
1962年朱德来到江西,得知昔日的女红军是农民,怒斥:简直瞎胡闹

1962年朱德来到江西,得知昔日的女红军是农民,怒斥:简直瞎胡闹

云霄纪史观
2026-05-15 01:42:57
敲诈中国10亿美元、拒绝中国飞机借道,如今这个国家又找上中国!

敲诈中国10亿美元、拒绝中国飞机借道,如今这个国家又找上中国!

春序娱乐
2026-04-20 04:52:53
当着全球的面,朝鲜立最高铁律:只要我被“斩首”,核弹立刻升空

当着全球的面,朝鲜立最高铁律:只要我被“斩首”,核弹立刻升空

小噎论事
2026-05-12 15:24:59
股权全质押!辽篮国企注资重建,赵继伟四年顶薪留队,策划三方交易强挖郭昊文

股权全质押!辽篮国企注资重建,赵继伟四年顶薪留队,策划三方交易强挖郭昊文

兰亭墨未干
2026-05-15 08:46:37
美国逼我国偿还百年前的债务,如若不还,欠我国的8600亿美元就赖账

美国逼我国偿还百年前的债务,如若不还,欠我国的8600亿美元就赖账

富强巨靠谱
2025-03-24 16:33:48
004核航母落空?美媒:除关键术落后,很多原因让中国没必要造它

004核航母落空?美媒:除关键术落后,很多原因让中国没必要造它

叹为观止易
2026-05-15 08:01:00
招商局集团领导班子调整!

招商局集团领导班子调整!

新浪财经
2026-05-15 07:26:46
国乒美女钱天一:26岁退役,不选编制选安置费,嫁世界冠军很幸福

国乒美女钱天一:26岁退役,不选编制选安置费,嫁世界冠军很幸福

以茶带书
2026-05-08 15:40:11
南方电网:立即停止一切非法行为

南方电网:立即停止一切非法行为

南方都市报
2026-05-15 08:22:16
特朗普访华晚宴曲目单曝光!12首歌背后藏着中美经贸回暖的强信号

特朗普访华晚宴曲目单曝光!12首歌背后藏着中美经贸回暖的强信号

热心市民小黄
2026-05-14 23:40:13
2026-05-15 12:40:49
腾讯技术工程
腾讯技术工程
不止于技术
1393文章数 601关注度
往期回顾 全部

科技要闻

两年联姻一地鸡毛,传苹果OpenAI濒临决裂

头条要闻

欢迎宴会座位公开:马斯克黄仁勋与中国企业家同桌吃饭

头条要闻

欢迎宴会座位公开:马斯克黄仁勋与中国企业家同桌吃饭

体育要闻

德约科维奇买的球队,从第6级联赛升入法甲

娱乐要闻

方媛回应住男生单人间:女孩的配得感

财经要闻

特朗普的北京时刻

汽车要闻

双零重力座椅/AI智能体/调光天幕 启境GT7内饰发布

态度原创

艺术
教育
手机
家居
时尚

艺术要闻

一个北大 “反卷教授” 的意外走红

教育要闻

在地球另一端,我成了这所小众留学院校法学院的首位中国学生

手机要闻

红魔11S Pro系列手机搭载8000mAh电池,自带80W氮化镓充电器

家居要闻

110㎡淡而有致的生活表达

看《给阿嬷的情书》,带纸巾,别带懂王

无障碍浏览 进入关怀版