我一直想知道在 python 中编写 if 语句的不同方式有什么意义。本质上,所有方法都归结为检查一个值是否等于另一个值。研究了一段时间后,我只能遇到 3 种不同的方法。在此线程中,我将展示我的代码以及我的发现,以便您了解如何以最高效率在 Python 中编写 if 语句。
import time
def if_test(x):
s = time.perf_counter()
if x == 1:
1
if x == 2:
2
else:
None
return time.perf_counter() - s
def match_test(x):
s = time.perf_counter()
match x:
case 1:
1
case 2:
2
case _:
None
return time.perf_counter() - s
def dict_test(x):
s = time.perf_counter()
{1: 1, 2: 2}.get(x)
return time.perf_counter() - s
if_speed = []
match_speed = []
dict_speed = []
for i in range(10000000):
if_speed.append(if_test(1))
match_speed.append(match_test(1))
dict_speed.append(dict_test(1))
print('if: ', sum(if_speed))
print('match: ', sum(match_speed))
print('dict: ', sum(dict_speed))
TLDR:有 3 种方法可以编写 if 语句。第一个是经典的“if-elif-else”语句。这是最常用的一种,令人惊讶的是,它并不是最快的。第二种是使用“匹配”语句。最后,还有使用字典的方法,并在其上使用“.get()”方法。
if: 4.6341567997587845
match: 4.472052920144051
dict: 8.842875797010493
跑了很多很多次后,我通常会找到这些排名。令人惊讶的是,这与我的预期大不相同。我希望字典 .get() 是最快的,因为它使用哈希表并且在找到正确的值之前不需要查看每个值。它更像是相反,几乎是其他方法的两倍。但是,如果您使用更多案例,结果可能会有所不同。根据我的发现,match 语句在运行之前被简单地编译成一个 if 语句,这是有道理的,因为它在性能方面通常接近 if 语句。然而,这并没有改变它始终快 4-5% 的事实。最后,令我惊讶的是 if 语句并不是最快的。我仍然认为应该使用它们,因为如果你有保护条款,它们就不会真正起作用。
我认为这个结果非常有趣,我个人肯定会更多地使用 match 语句。我可能会用 python 中的其他类型的常见任务尝试这个实验,以获得我的程序的最大效率。如果我做错了什么,或者还有其他的 if 语句,请告诉我,我可以测试它们。