Python 为什么list()、dict()和tuple()比[]、{}和()慢?
我最近研究了在需要创建三者中的一个空值时,分别使用Python 为什么list()、dict()和tuple()比[]、{}和()慢?,python,Python,我最近研究了在需要创建三者中的一个空值时,分别使用list()、dict()、tuple()代替[]、{}和()。理由是它看起来更具可读性。我本来想征求大家对风格的意见,但后来我决定测试一下性能。我这样做: >>> from timeit import Timer >>> Timer('for x in range(5): y = []').timeit() 0.59327821802969538 >>> from timeit import
list()
、dict()
、tuple()
代替[]
、{}
和()
。理由是它看起来更具可读性。我本来想征求大家对风格的意见,但后来我决定测试一下性能。我这样做:
>>> from timeit import Timer
>>> Timer('for x in range(5): y = []').timeit()
0.59327821802969538
>>> from timeit import Timer
>>> Timer('for x in range(5): y = list()').timeit()
1.2198944904251618
我尝试了dict()
,tuple()
和list()
,每个的函数调用版本都比语法版本({}
[]
,()
)糟糕得难以置信,因此,我有3个问题:
timeit
关闭垃圾收集,但考虑到我只使用了range(5)
,这不可能产生效果要查找
dict
、tuple
和list
,需要进行范围查找,并且需要搜索多个范围才能找到它们。使用语法糖,编译器可以知道需要创建特定对象,因此可以发出正确的字节码来执行此操作。函数调用需要变量名查找,然后是函数调用。然后调用的函数创建一个列表并返回它。list语法文本使解释器只生成一个列表:
>>> import dis
>>> foo = lambda :[]
>>> bar = lambda :list()
>>> dis.dis(foo)
1 0 BUILD_LIST 0
3 RETURN_VALUE
>>> dis.dis(bar)
1 0 LOAD_GLOBAL 0 (list)
3 CALL_FUNCTION 0
6 RETURN_VALUE
>>>
回答#3
默认情况下,实际重复您的程序100万次。因此,事实上,您正在1.2秒内创建500万个列表。re:style-opinion-我经常使用[]。我想这已经足够清楚了。不过,性能问题很有趣。在习惯python之前,python有很多东西看起来很奇怪。我总是更喜欢
[]
而不是list()
,因为list()
实际上可能不是\uuuuuuuuuuuu内置的.list
。买家要小心。[]
不是任何东西的语法糖。这是一个列表文字。麦克盖:这确实是一个语法糖。可以通过调用list()
生成列表,但编译器会将相应上下文中的方括号解释为创建列表。当遇到[]
时,编译器不会调用list()
。看看我的答案。
>>> from dis import dis
>>> dis(lambda: list())
1 0 LOAD_GLOBAL 0 (list)
3 CALL_FUNCTION 0
6 RETURN_VALUE
>>> dis(lambda: [])
1 0 BUILD_LIST 0
3 RETURN_VALUE