可能永远不会有 Python 4.0

Python018

可能永远不会有 Python 4.0,第1张

在一次问答中,Python编程语言的创建者吉多·范罗森(Guido van Rossum)说,在经历python2.0到python3.0的迁移出现问题之后,“从严肃的意义上谈论python4几乎是禁忌”。

不要对Python4.0抱太大希望,范罗森说,它可能永远不会到来。

在接受微软Reactor的采访时,范罗森被问及Python的未来,以及该编程语言是否会出现4.0版。

范罗森回答说,他和Python的核心开发团队成员对Python 4的想法并不十分兴奋,他们在python2到python3的过渡过程中吸取了宝贵的经验教训,而python3在2008年首次亮相。

他在视频问答中表示:"我对Python 4的想法并不感到兴奋,核心开发团队中也没有人真正是——因此,可能永远不会有4.0,我们至少会一直编号到3.33。"

"Python4,在这一点上,无论何时在核心开发团队中提到它,都非常像一个笑话……我们已经从Python3和Python2中吸取了教训,因此从严肃的意义上讲Python4几乎是禁忌。"

Python 2.7.18 是Python 2.7 生命周期中的最后一个版本,发布于 2020 年 4 月。范罗森曾警告说,Python 3 将无法与 Python 2 兼容,而基于 Python 2 创建的软件无法升级到 3.0 版本。

这是一个缓慢而痛苦的迁移期,持续了好几年,很明显范罗森和他的同事们并不急于重温。

范罗森说:"我通常认为这是一个错误,因为Python比核心开发人员意识到的要成功得多,因此我们应该更加意识到并支持从python2过渡到python3。"

"根据我们自己的经验,我们认为转换会相对简单,因为我们都像Python编程的爱因斯坦,我们可以在睡梦中将代码从Python2翻译成Python3。"

范罗森并没有完全排除Python4.0的可能性,不过他表示,只有在与C的兼容性发生重大变化时,才会出现这种情况。"我可以想象,在某个时刻,我们被迫放弃某些二进制或API兼容的C扩展…… 如果有一个显著不兼容的C扩展而不改变语言本身,如果我们能够摆脱GIL[全局解释器锁];如果其中一个或两个事件都发生,我们可能会被迫将其称为4.0,因为C扩展级别的兼容性问题。"

随着python3.10有望在10月份面世,3.11版本的速度也将有一些显著的提高,范罗森强调,重点是尽可能长时间地发布对编程语言的增量更新。

"我们现在有一个严格的年度发布时间表,所以在[python3.10]之后是3.11,之后是3.12,以此类推。我们可以先升到3.99,然后再加一个数字。添加另一个数字并不是很简单,但仍然比从[版本]3到4要好得多。"

"Python的加速将是渐进的。一些新的速度将在3.11中出现,然后我们将在3.12和3.13中进一步加速,以此类推。"

在采访中,范罗森还提到了外部项目为加快语言速度所做的努力,比如pyston,它是python3.8.8的一个实现,在开源之前就在Dropbox上启动。它的创建者最近发布了pyston2.2,它承诺比cpython3.8.8的性能提高30%。

"我想说,让Python变得更快突然又回到了新闻头版。我希望我的团队能为这个领域做出贡献。因为我确实对那个领域有所了解。"范罗森说。

"现在,我们觉得我们还有大约一年的时间来证明我们可以在Python性能上下功夫,3.11将比3.10快得多。"

范罗森分享了他对其他编程语言的看法,他说,他钦佩 Rust 改进C++代码的能力,并引用Go作为最有趣的新"Pythonic"编程语言之一。

Python 的创造者还描述了 Python 近年来如何开始寻找 TypeScript 作为确定事情可能走向何方的因素。"你可能已经注意到,在过去的六七年里,我们一直在为Python添加可选的静态类型,也称为渐进类型",他说。

"当我们开始那个项目的时候,我并没有意识到TypeScript,所以我不能说我们最初是受TypeScript启发的……现在我们肯定会以TypeScript为例,有时我们会提出新的特性,因为我们知道TypeScript最初缺少某些特性,然后根据用户需求添加到其中,非常成功。"

范罗森说,"Python仍在试图找出如何重现这些成功的方法。安德斯[赫茨伯格]是个非常聪明的人[TypeScript]做了一些Python仍在等待解决的事情。"

"从我与安德斯的对话中,听起来TypeScript也在向Python学习,就像JavaScript在一些领域向Python学习一样。"

机器之心报道

2020 年 1 月 1 日,Python 官方结束了对 Python 2 的维护,意味着 Python 2 完全退休,进入 Python 3 时代。之后,关于 Python 4 的发布排期也成为了社区的热门议题。

去年,Python 之父 Van Rossum 在推特上表示,假如会有 Python 4,从 3 到 4 的版本过渡会更像从 1 到 2 的过渡,而不会像从 2 到 3 的过渡。

但在最近接受 Microsoft Reactor 采访时,Van Rossum 被问及 Python 的未来,以及什么时候会出 Python 4.0。 他却表示,可能不会有 Python 4 了。

Van Rossum 回答说:「我和 Python 核心开发团队的成员对 Python 4.0 没什么想法,提不起兴趣,估计至少会一直编号到 3.33。」

视频地址:https://www.youtube.com/watch?v=aYbNh3NS7jA

在从 Python 2 过渡到 Python 3 时已经被上了一课的 Van Rossum 表示,在内部的严肃场合,谈论 Python 4 是个禁忌,大家只会在饮茶时把 Python 4 当玩笑开。

2020 年 4 月,Python 2.7 生命周期中的最后一个版本 - Python 2.7.18 发布了。彼时 Van Rossum 警告过开发人员 Python 3 与 Python 2 不兼容,因此基于 Python 2 的软件库依赖项将不能升级至版本 3.0。

那是一个延续了数年之久,缓慢而又痛苦的迁移期。Van Rossum 说:「实际上,Python 比核心开发人员意识到的要成功得多,因此我们应该对从 Python 2 过渡到 Python3 更加了解和支持。但当时我们错误地认为过渡会很简单,因为我们都像 Python 编程中的爱因斯坦一样,可以在睡眠中将代码从 Python 2 转换为 Python3。」

不过,Van Rossum 并没有完全排除 Python 4.0 的可能性,他暗示道,当 Python 与 C 的兼容性发生重大变化时,可能会改变目前的想法。Van Rossum 表示:「如果不更改语言就会与 C 扩展存在严重的不兼容,或者我们能够摆脱全局解释器锁(GIL),这样的情况下我们可能被迫升级至 Python4.0。」

然而,关于预计在 10 月发布的 Python 3.10,以及将实现一些重大速度提升的版本 3.11,Van Rossum 强调,重点依旧是尽可能长时间地渐进式的更新编程语言。

两年前,Guido van Rossum 从 Dropbox 离职,宣布退休,但又在 2020 年 11 月加入了微软,主动结束了自己的退休生活。当时他表示,将致力于「使用户更好地使用 Python(并且不仅仅是在 Windows 系统上)」。

「现在,我们有一个严格的年度发布时间表,Python 3.10 之后是 3.11,之后是 3.12,依此类推。(在 Python 4 之前)我们必须先发布 3.9,每次添加另一个数字并不是容易的事,但仍然比从 3 到 4 轻松得多。」

「Python 的加速是渐进式的,3.11 版本会有新的速度提升,我们会在 3.12 和 3.13 中将其进一步提高。」

接下来,让 Python 更快是 Python 核心开发团队的工作重点。在近日的 PyCon Language Summit 上,Van Rossum 宣布目标是在 3.11 版本中将 CPython 的性能提高一倍。

Van Rossum 还介绍了通过外部项目(比如 Pyston)来加速语言的努力,Pyston 项目是 Python 3.8.8 的实现,该实现最初发布在 Dropbox,后来开源。其创建者最近发布了 Pyston 2.2,相比 CPython 3.8.8 的性能提高了 30%。

「现在,我觉得大约有一年时间来证明我们在 Python 性能上取得了进步,3.11 会比 3.10 快得多。」

同时,Van Rossum 也分享了自己对其他编程语言的看法,他欣赏 Rust 改进 C++ 代码的能力,并且 Go 是「比较 Python」的语言中最有趣的。

「你可能注意到,在过去的六七年里,我们一直在 Python 中添加可选的静态类型,也叫渐进类型。」Python 之父也介绍了 Python 近年来对 TypeScript 的重视程度。

「当开始项目时,我实际上并不了解 TypeScript,所以我不能说最初是受到了 TypeScript 的启发…… 如今,我们肯定是以 TypeScript 为样板,有时我们发布了新功能,因为某些功能相对 Typescript 是缺失的,然后我们根据用户需求将其进行添加,非常成功。」

Van Rossum 说,Python 仍然在努力寻找重获成功的方法。在他看来,Hejlsberg 是一个非常聪明的人,TypeScript 正在做的一些事情,是 Python 未来需要弄清楚的。实际上 TypeScript 也在向 Python 学习,就像 JavaScript 在一些领域从 Python 那里学习一样。

参考链接:https://www.tectalk.co/why-python-4-0-might-never-arrive-according-to-its-creator/

pre{overflow-x: auto}

Python 是世界上使用最广泛的编程语言之一。它是一种解释型高级通用编程语言,具有广泛的用途,几乎可以将其用于所有事物。其以简单的语法、优雅的代码和丰富的第三方库而闻名。python除了有很多优点外,但在速度上还有一个非常大的缺点。

虽然Python代码运行缓慢,但可以通过下面分享的5个小技巧提升Python运行速度!

首先,定义一个计时函数timeshow,通过简单的装饰,可以打印指定函数的运行时间。

这个函数在下面的例子中会被多次使用。

def timeshow(func):     from time import time     def newfunc(*arg, **kw):         t1 = time()         res = func(*arg, **kw)         t2 = time()         print(f"{func.__name__: >10} : {t2-t1:.6f} sec")         return res     return newfunc @timeshow def test_it():     print("hello pytip") test_it() 1. 选择合适的数据结构

使用正确的数据结构对python脚本的运行时间有显着影响。Python 有四种内置的数据结构:

列表 : List

元组 : Tuple

集合 : Set

字典 : Dictionary

但是,大多数开发人员在所有情况下都使用列表。这是不正确的做法,应该根据任务使用合适数据结构。

运行下面的代码,可以看到元组执行简单检索操作的速度比列表快。其中dis模块反汇编了一个函数的字节码,这有利于查看列表和元组之间的区别。

import dis def a():     data = [1, 2, 3, 4, 5,6,7,8,9,10]     x =data[5]     return x def b():     data = (1, 2, 3, 4, 5,6,7,8,9,10)     x =data[5]     return x print("-----:使用列表的机器码:------") dis.dis(a) print("-----:使用元组的机器码:------") dis.dis(b)

运行输出:

-----:使用列表的机器码:------

3 0 LOAD_CONST 1 (1)

2 LOAD_CONST 2 (2)

4 LOAD_CONST 3 (3)

6 LOAD_CONST 4 (4)

8 LOAD_CONST 5 (5)

10 LOAD_CONST 6 (6)

12 LOAD_CONST 7 (7)

14 LOAD_CONST 8 (8)

16 LOAD_CONST 9 (9)

18 LOAD_CONST 10 (10)

20 BUILD_LIST 10

22 STORE_FAST 0 (data)

4 24 LOAD_FAST 0 (data)

26 LOAD_CONST 5 (5)

28 BINARY_SUBSCR

30 STORE_FAST 1 (x)

5 32 LOAD_FAST 1 (x)

34 RETURN_VALUE

-----:使用元组的机器码:------

7 0 LOAD_CONST 1 ((1, 2, 3, 4, 5, 6, 7, 8, 9, 10))

2 STORE_FAST 0 (data)

8 4 LOAD_FAST 0 (data)

6 LOAD_CONST 2 (5)

8 BINARY_SUBSCR

10 STORE_FAST 1 (x)

9 12 LOAD_FAST 1 (x)

14 RETURN_VALUE

看下列表的机器码,冗长而多余!

2. 善用强大的内置函数和第三方库

如果你正在使用python并且仍在自己编写一些通用函数(比如加法、减法),那么是在侮辱python。 Python有大量的库和内置函数来帮助你不用编写这些函数。 如果研究下,那么你会惊奇地发现几乎90%的问题已经有第三方包或内置函数来解决。

可以通过访问官方文档查看所有内置函数。你也可以在wiki python上找到更多使用内置函数的场景。

比如,现在我们想合并列表中的所有单词为一个句子,比较法自己编写和调用库函数的区别:

# ❌ 正常人能想到的方法 @timeshow def f1(list):     s =""     for substring in list:         s += substring     return s # ✅ pythonic 的方法 @timeshow def f2(list):     s = "".join(list)     return s l = ["I", "Love", "Python"] * 1000 # 为了看到差异,我们把这个列表放大了 f1(l) f2(l)

运行输出:

f1 : 0.000227 sec

f2 : 0.000031 sec

3. 少用循环

用 列表推导式 代替循环

用 迭代器 代替循环

用 filter() 代替循环

减少循环次数,精确控制,不浪费CPU

## 返回n以内的可以被7整除的所有数字。 # ❌ 正常人能想到的方法: @timeshow def f_loop(n):      L=[]     for i in range(n):         if i % 7 ==0:             L.append(i)     return L #  ✅ 列表推导式 @timeshow def f_list(n):     L = [i for i in range(n) if i % 7 == 0]     return L # ✅  迭代器 @timeshow def f_iter(n):     L = (i for i in range(n) if i % 7 == 0)     return L # ✅ 过滤器  @timeshow def f_filter(n):     L = filter(lambda x: x % 7 == 0, range(n))     return L # ✅ 精确控制循环次数  @timeshow def f_mind(n):     L = (i*7 for i in range(n//7))     return L n = 1_000_000 f_loop(n) f_list(n) f_iter(n) f_filter(n) f_mind(n)

输出为:

f_loop : 0.083017 sec

f_list : 0.056110 sec

f_iter : 0.000015 sec

f_filter : 0.000003 sec

f_mind : 0.000002 sec

谁快谁慢,一眼便知!

filter 配合 lambda 大法就是屌!!!

4. 避免循环重复计算

如果你有一个迭代器,必须用它的元素做一些耗时计算,比如匹配正则表达式。你应该将正则表达式模式定义在循环之外,因为最好只编译一次模式,而不是在循环的每次迭代中一次又一次地编译它。

只要有可能,就应该尝试在循环外进行尽可能多的运算,比如将函数计算分配给局部变量,然后在函数中使用它。

# ❌ 应改避免的方式: @timeshow def f_more(s):     import re     for i in s:         m = re.search(r'a*[a-z]?c', i) # ✅ 更好的方式: @timeshow def f_less(s):     import re     regex = re.compile(r'a*[a-z]?c')     for i in s:         m = regex.search(i) s = ["abctestabc"] * 1_000 f_more(s) f_less(s)

输出为:

f_more : 0.001068 sec

f_less : 0.000365 sec

5. 少用内存、少用全局变量

内存占用是指程序运行时使用的内存量。为了让Python代码运行得更快,应该减少程序的内存使用量,即尽量减少变量或对象的数量。

Python 访问局部变量比全局变量更有效。在有必要之前,应该始终尝试忽略声明全局变量。一个在程序中定义过的全局变量会一直存在,直到整个程序编译完成,所以它一直占据着内存空间。另一方面,局部变量访问更快,且函数完成后即可回收。因此,使用多个局部变量比使用全局变量会更好。

# ❌ 应该避免的方式: message = "Line1\n" message += "Line2\n" message += "Line3\n" # ✅ 更好的方式: l = ["Line1","Line2","Line3"] message = '\n'.join(l) # ❌ 应该避免的方式: x = 5 y = 6  def add():     return x+y add() # ✅ 更好的方式: def add():     x = 5     y = 6     return x+y add()

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!