两个if语句之间的性能差异?

问题描述

我问自己,如果我使用带有x个条件的if语句或每个仅包含1个条件的x if语句,这是否会对性能产生影响?

例如:
具有3个条件的if语句:

if a == 0 and b == 0 and c == 0:
    #do something

3条if语句,每个条件只有一个条件:

if a == 0:
    if b == 0:
        if c == 0:
            #do something

为什么我想知道这个?
我有一个带有大约30个条件的if语句,并且我的代码真的很乱,所以我考虑将if语句分成两半。 我认为本示例的结果将是相同的,但是我不知道如果使用a = 1会不会有明显的性能差异。即使第一个条件(a为1而不是0)为假,程序也会在第一个示例中检查所有3个条件吗?

解决方法

对于给定的示例,即使初始条件if a == 0 and b == 0 and c == 0:本身为False,即使使用b == 0,也不会检查a == 0的性能。但是考虑到最少的代码行和可读性,if a == 0 and b == 0 and c == 0:是更好的选择。

,

您可以使用timeit库测试脚本的性能。我将在下面添加一个示例。

import timeit

stmt1 = 'if a == 0 and b == 0 and c == 0: pass'
stmt2 = """\
if a == 0: 
    if b == 0: 
        if c == 0: 
            pass
"""
setup1 = 'a,b,c = 0,0'
setup2 = 'a,c = 1,0'

print(f"First statement First setup execution time = {timeit.timeit(stmt=stmt1,setup=setup1,number=10**9)}")
print(f"First statement Second setup execution time = {timeit.timeit(stmt=stmt1,setup=setup2,number=10**9)}")
print(f"Second statement First setup execution time = {timeit.timeit(stmt=stmt2,number=10**9)}")
print(f"Second statement Second setup execution time = {timeit.timeit(stmt=stmt2,number=10**9)}")

输出:

First statement First setup execution time = 38.7665075
First statement Second setup execution time = 15.4141367
Second statement First setup execution time = 38.29726529999999
Second statement Second setup execution time = 15.527892699999995

这表明格式化if语句的方式可以忽略不计。但是,如果第一个条件为假,则将不检查其余条件,并且代码的执行将更快。

编辑:

此外,在看到下面的wjandrea评论之后,如果将来有人想知道为什么这样做,我想将其添加到答案中。通过python Wiki,您可以了解有关short-circuiting operator behavior的信息。

,

您的两个代码之间的任何时差都是完整的,并且总会产生噪音。运行您的代码十亿次,运行一个或另一个之间可以节省的时间少于我编写这两个句子所花费的时间。

严重的是,如果您需要担心这两段代码之间的时间差异,那么Python是错误的语言。

,

是的!我认为,如果您可以一行编写代码,则可以提高生产率/性能,因为通常情况下,它更易于阅读和解释。如果您使用描述性变量,则更是如此。

在您的代码中,我看到一些可以改进的地方:我们称之为(1)赋值运算符,即equal(=)符号; (2)比较运算符,即“等于”(==),“大于”(>),“小于”(

定义变量时,使用赋值运算符(=)符号。例如:

a = 0
b = 0
c = 0

另一方面,我们在进行条件语句时使用比较运算符(例如(==)符号)。例如:

if a == 0 and b == 0 and c == 0:
    # do something

关于您的第二个问题:即使第一个条件(a为1而不是0)为假,程序也会在第一个示例中检查所有3个条件吗?

a = 1
b = 0
c = 0

if a == 0:
    if b == 0:
        if c == 0:
            # do something

Python会将条件与分配的变量进行比较,如果条件变为False,则不会出现ERROR,但也不会执行您在if语句中提供的指令(即:它不会#做某事)。

希望我能对您有所帮助。