我最近分别使用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()
,并且每个函数调用版本都比语法版本({}
[]
,{{ 1}})所以,我有3个问题:
()
会关闭垃圾收集,但考虑到我只使用timeit
时,这可能不会产生影响。答案 0 :(得分:18)
函数调用需要变量名查找,然后是函数调用。然后调用的函数创建一个列表并返回它。列表语法文字使解释器只能创建一个列表:
>>> 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
>>>
答案 1 :(得分:5)
回答#3。
timeit默认情况下会重复您的程序1 000 000次。事实上,你在1.2秒内创建了500万个列表。
答案 2 :(得分:2)
>>> 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
答案 3 :(得分:0)
要查找dict
,tuple
和list
,需要进行范围查找,并且需要搜索多个范围才能找到它们。使用语法糖,编译器可以知道需要创建特定对象,因此可以发出正确的字节码来执行此操作。