【问题标题】:Does excluding the `else` affect the performance in Python 3?排除 `else` 会影响 Python 3 中的性能吗?
【发布时间】:2020-06-22 22:06:57
【问题描述】:

我一直在寻找这个问题的现有答案,虽然我遇到了专门针对 C# 的 this answer,但这是编译器级别的事情,所以我预计 Python 可能会有所不同。

看看这两种终止函数的方式。第一个 else:

if condition:
    return some_val
else:
    return some_other_val

然后一个没有它:

if condition:
    return some_val
return some_other_val

从逻辑上讲,两者做的事情完全相同,即使condition 有副作用。他们测试condition,然后返回一个值。

Python 3 是否有可能对另一个进行优化?

【问题讨论】:

  • iPython 中的操作员 %timeit 会比任何人的猜测更好地回答您的问题。 (提示:声明 without else 似乎有点慢。)
  • @DYZ iPython 的性能会不会有所不同?
  • IPython 是 Python 的接口。为什么会这样?
  • @DYZ repl 并不总是执行相同的编译时优化(解释时?它被编译为字节码,所以我们可以安全地说编译时)

标签: python python-3.x if-statement return conditional-statements


【解决方案1】:

找出一个简单的方法是在一个循环中重复执行这两项操作(比如 1000 万次),同时计算两者的时间,看看有什么区别。

【讨论】:

    【解决方案2】:

    如果您只想知道是否有优化,您可以使用snakeviz 之类的内容来确定。很难给出一个硬性和快速的优化规则,因为每个代码都会带来不同的执行。例如,如果你只是做一个简单的 x + y 计算,它可能会给你一个无限小的边缘而不包括它,其中一个具有可变输入的复杂方法可能会导致机器做更多的工作来理解它应该做什么做。

    据我了解,始终包含 else 语句被认为是一种最佳做法。 "Explicit is better than implicit." 总是使用 else 语句为程序在每种情况下做什么提供了一个硬性规则,它更容易阅读(随着您的代码变得更加复杂),它还可以帮助您避免错误.

    为了更好的可读性的例子:

    variable_one = "v1"
    variable_two = "v2"
    if variable_one.isdigit() == False:
        if variable_one == "a":
            print("The variable is a")
        elif variable_one == "d":
            print("The variable is d")
        if variable_two == "v1":
            pass
    if variable_two == "v2":
        print("variable 2 is v2")
    

    虽然仍然毫无意义的愚蠢,但这段代码提高了可读性:

    variable_one = "v1"
    variable_two = "v2"
    if variable_one.isdigit() == False:
        if variable_one == "a": print("The variable is a")
        elif variable_one == "d": print("The variable is d")
        else: pass
    
        if variable_two == "v1": pass
        else: print ("this variable was not passed")
    else: pass
    
    if variable_two == "v2": print("variable 2 is v2")
    else: pass
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2012-02-04
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 2010-09-26
      相关资源
      最近更新 更多