两个 if 语句之间的性能差异?
Performance difference between two if statements?
我问自己,如果我使用带有 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:
当初始条件 a == 0
本身为 False 时它也不会检查 b == 0
。但考虑到最少的代码行和可读性,if a == 0 and b == 0 and c == 0:
将是更好的选择。
你的两段代码之间的任何时间差都是完整的,完全是噪音。 运行 你的代码十亿次,你可能在 运行 两者之间节省的时间少于我写这两句话所花费的时间。
说真的,如果你需要担心两段代码之间的时间差异,Python是语言错误。
您可以使用 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, 0'
setup2 = 'a, b, c = 1, 0, 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, setup=setup1, number=10**9)}")
print(f"Second statement Second setup execution time = {timeit.timeit(stmt=stmt2, setup=setup2, 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.
的内容
是的!我认为如果您可以在一行中编写代码,那么 productivity/performance 会增加,因为通常它更容易阅读和解释;如果您使用描述性变量,则更是如此。
在您的代码中,我看到了一些可以改进的地方:有我们所说的 (1) 赋值运算符,即等号 (=); (2) 比较运算符,即“等于”(==)、“大于”(>)、“小于”(<)等
当我们定义一个变量时,我们使用赋值运算符(=)符号。例如:
a = 0
b = 0
c = 0
另一方面,我们在做条件语句时使用比较运算符(例如(==)符号)。例如:
if a == 0 and b == 0 and c == 0:
# do something
关于你的第二个问题:程序是否会检查第一个示例中的所有 3 个条件,即使第一个条件(a 是 1 而不是 0)为假?
a = 1
b = 0
c = 0
if a == 0:
if b == 0:
if c == 0:
# do something
Python 会将条件与您分配的变量进行比较,如果条件结果为 False,则不会出现错误,但它也不会执行您在你的if-statement(意思是:它不会#做某事)。
希望对你有所帮助。
我问自己,如果我使用带有 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:
当初始条件 a == 0
本身为 False 时它也不会检查 b == 0
。但考虑到最少的代码行和可读性,if a == 0 and b == 0 and c == 0:
将是更好的选择。
你的两段代码之间的任何时间差都是完整的,完全是噪音。 运行 你的代码十亿次,你可能在 运行 两者之间节省的时间少于我写这两句话所花费的时间。
说真的,如果你需要担心两段代码之间的时间差异,Python是语言错误。
您可以使用 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, 0'
setup2 = 'a, b, c = 1, 0, 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, setup=setup1, number=10**9)}")
print(f"Second statement Second setup execution time = {timeit.timeit(stmt=stmt2, setup=setup2, 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.
的内容是的!我认为如果您可以在一行中编写代码,那么 productivity/performance 会增加,因为通常它更容易阅读和解释;如果您使用描述性变量,则更是如此。
在您的代码中,我看到了一些可以改进的地方:有我们所说的 (1) 赋值运算符,即等号 (=); (2) 比较运算符,即“等于”(==)、“大于”(>)、“小于”(<)等
当我们定义一个变量时,我们使用赋值运算符(=)符号。例如:
a = 0
b = 0
c = 0
另一方面,我们在做条件语句时使用比较运算符(例如(==)符号)。例如:
if a == 0 and b == 0 and c == 0:
# do something
关于你的第二个问题:程序是否会检查第一个示例中的所有 3 个条件,即使第一个条件(a 是 1 而不是 0)为假?
a = 1
b = 0
c = 0
if a == 0:
if b == 0:
if c == 0:
# do something
Python 会将条件与您分配的变量进行比较,如果条件结果为 False,则不会出现错误,但它也不会执行您在你的if-statement(意思是:它不会#做某事)。
希望对你有所帮助。