【问题标题】:Using line breaks in variable assignment [closed]在变量赋值中使用换行符[关闭]
【发布时间】:2018-01-09 14:26:49
【问题描述】:

我正在用 python 做一些事情,我有几个变量是通过很长的公式计算出来的。我在这个网站上做了一些搜索,我发现 python 允许隐式换行,这对我来说是一个解决方案,因为我可以将公式延伸到多行: line-breaking

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

A = b + c + d + e

我将其编码为:

A = b + c
A += d + e

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

【问题讨论】:

  • 换行符通常应该用于提高可读性,而不是性能。

标签: python python-3.x


【解决方案1】:

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

对于字符串,作为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 解释器,而不是重复连接。

对于ints、floats 和complex 类型,单行方法的性能会稍微好一些,这仅仅是因为它避免了不必要的存储和加载指令,但差别不大;它们都是不可变的标量值,因此无论如何都不会发生值的就地操作,您将在处理过程中创建相同数量的临时对象,唯一的问题是它们是否(简要)绑定到本地名称.

坦率地说,如果不是连接字符串或序列的问题(前者应该用''.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 语句的示例)。

【讨论】:

  • 实际公式由复数相加(和相乘)组成。我的公式的一个更现实的例子是: A = b * (c+d+e) + f * (g*h+i) 其中在某些情况下 (c+d+e) 已经被拆分为更多超过 1 行。
  • @Frederico:是的,对于内置数字类型,分离步骤在技术上会使其变慢,但只是微不足道。如果你可以通过更多的分解来使代码更具可读性,那就去做吧;在最热门的代码路径之外(在这种情况下,可能避免使用 Python 是值得的),减少的维护工作比额外的存储/加载指令所产生的几纳秒的“成本”更值得。
  • 如果公式真的那么长,为了便于阅读,我可能会分解计算并以有意义的方式命名部分术语,例如bla = c + d + e。然后在下一步中使用bla,以此类推。这也允许更好地调试部分结果。
猜你喜欢
  • 2021-02-09
  • 2014-09-10
  • 2015-02-08
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 2022-08-17
  • 2022-12-16
  • 2014-10-31
相关资源
最近更新 更多