Phi*_*son 2 python if-statement
我最近在一个班级上经常使用 python3 并发现你可以写
if x in [1,2,3]:
print("x is 1,2 or 3")
Run Code Online (Sandbox Code Playgroud)
代替
if x == 1 or x == 2 or x ==3:
print("x is 1,2 or 3")
Run Code Online (Sandbox Code Playgroud)
这被认为是好的还是坏的做法,它是“pythonic”吗?
共识似乎是
if x in {1,2,3}: # set {}, not list []
print("x is 1,2 or 3")
Run Code Online (Sandbox Code Playgroud)
效率更高,O(1) vs O(n),因此更快。此外,它不那么冗长地表达了相同的东西,这也使它更加“pythonic”。
是的。
正如@Selcuk 在评论中提到的那样,它的效率肯定不会降低:
性能差异来自实现开销,否则它们都是
O(n)而set操作实际上更快O(1)。
听力设置应该会让你感到困惑,首先通读所有内容,最后你会看到set成员资格测试,以下是时间安排:
from timeit import timeit
x = 2
print(timeit(lambda: x in [1, 2, 3], number=10000000))
print(timeit(lambda: x == 1 or x == 2 or x == 3, number=10000000))
Run Code Online (Sandbox Code Playgroud)
输出:
2.9532112044043597
3.614175814476062
Run Code Online (Sandbox Code Playgroud)
所以这意味着,你的第一个列表成员测试解决方案比多个or条件更快。
正如@Austin 所提到的,set成员资格测试速度更快。
因此,如果我们检查set会员时间,例如:
from timeit import timeit
x = 2
print(timeit(lambda: x in {1, 2, 3}, number=10000000))
Run Code Online (Sandbox Code Playgroud)
它会输出:
2.7767165870317445
Run Code Online (Sandbox Code Playgroud)
所以set会员是最快的。