解压缩分配与链接分配

时间:2015-12-08 20:16:55

标签: python python-2.7

假设您需要将两个变量初始化为None 遵循Zen of Python应该使用哪种方式(以及为什么)?
(假设您可以选择以下方法)

解包分配

a, b = None, None  # Explicit


链式分配

a = b = None # faster. Still readable (perhaps less explicit than unpack?)

明确的概念更好"似乎它适用于任何一种情况。

1 个答案:

答案 0 :(得分:2)

解包分配与链式分配

a, b = None, None  # Explicit

以上显式的。它明确地并且不必要地创建了额外的数据结构:

a, b = None, None   
#makes (None, None) before unpacking and giving to a and b

相反,做链式分配。这也显式地做你想要的,而不做任何不必要的事情。我认为这是该语言的优雅应用:

a = b = None

如果您觉得上述情况,在其独特的背景下,过于密集而无法阅读,您也可以毫无羞耻地做到这一点:

a = None
b = None

反汇编,Python 2和3:

import dis

def tupleunpack():
    a, b = None, None

def chainedassignment():
    a = b = None

def multiline():
    a = None
    b = None

>>> dis.dis(tupleunpack)
  2           0 LOAD_CONST               1 ((None, None))
              3 UNPACK_SEQUENCE          2
              6 STORE_FAST               0 (a)
              9 STORE_FAST               1 (b)
             12 LOAD_CONST               0 (None)
             15 RETURN_VALUE
>>> dis.dis(chainedassignment)
  2           0 LOAD_CONST               0 (None)
              3 DUP_TOP
              4 STORE_FAST               0 (a)
              7 STORE_FAST               1 (b)
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE
>>> dis.dis(multiline)
  2           0 LOAD_CONST               0 (None)
              3 STORE_FAST               0 (a)

  3           6 LOAD_CONST               0 (None)
              9 STORE_FAST               1 (b)
             12 LOAD_CONST               0 (None)
             15 RETURN_VALUE

反汇编表明元组解包会创建不必要的数据结构。 多线不必要地加载无两次。在消除不必要的过程方面,链式分配是优选的。

性能,Python 3:

元组拆包似乎通常需要稍微多一点的时间:

>>> import timeit
>>> timeit.repeat(tupleunpack)
[0.09981771527421301, 0.10060130717376126, 0.10003051661827556]
>>> timeit.repeat(chainedassignment)
[0.09882977371520241, 0.0981032306866183, 0.0982816216005773]
>>> timeit.repeat(multiline)
[0.09878721344639274, 0.09834682031024045, 0.09854603858978805]

Zen为代码辩护?

此外,Python的Zen描述了Python语言发展的紧张原则。因此,当人们用它来证明代码的合理性时,我总是很谨慎。不要试图从禅宗格言的集合中获取具体的方向,而是在语言中明确提供语义上正确的事情(例如,在这种情况下,链式赋值。)