在变量赋值中使用换行符

时间:2018-01-09 14:26:49

标签: python python-3.x

我在python中处理某些事情,我有几个由很长的公式计算的变量。我在这个网站上做了一些搜索,我发现python允许隐式换行,这对我来说是一个解决方案,因为我可以在多行上拉伸公式: line-breaking

现在我一直以不同的方式工作。让我举个例子,如果A将由以下公式给出:

A = b + c + d + e

我将其编码为:

A = b + c
A += d + e

我想知道什么是首选方法。在我当前的方法中使用隐式换行是否有计算优势?

1 个答案:

答案 0 :(得分:4)

我们需要更多的上下文来确定,但这里有一些示例案例。

对于字符串,作为CPython的实现细节,显式拆分会更好(有时很多更好),因为there is an optimization for an add (a = a + b) or inplace add (a += b) where the add/iadd instruction itself is immediately followed by a store to the left-hand side of the add.这就是说,对于字符串,你会更可靠通过执行A = ''.join((b, c, d, e))而不是重复连接而不管操作数大小或特定Python解释器的性能。

对于intfloatcomplex类型,单行方法将会更加高效,仅仅是因为它避免了不必要的存储和加载指令,但差别很小;它们都是不可变的标量值,因此无论如何都不会发生值的就地操作,你将在处理期间创建相同数量的临时值,唯一的问题是它们是否(简要地)绑定到本地名称

坦率地说,如果不是连接字符串或序列(前者应该使用''.join,后者使用itertools.chain来获得O(n)性能),首选方法是不是行连续字符(很容易被不可见的尾随空格弄乱)但是用于分组的简单括号。如果A = b + c + d + e的真实姓名太长而无法排成一行,我的首选方法是:

A = (b + c +
     d + e)

PEP8 prefers to break lines before the next operator,而不是之后,所以严格的PEP8代码将是:

A = (b + c
     + d + e)

这是PEP8(Python样式指南)支持的方法,它说:

  

包装长行的首选方法是在括号,括号和括号内使用Python隐含的行继续。通过在括号中包装表达式,可以在多行中分割长行。这些应该优先使用反斜杠进行续行。

使用反斜杠的唯一真实情况是括号不是语法的合法部分(链接包含with语句的示例)。