考虑到这个简单的条件:
if x == y or x == z:
print("Hello World!");
据我所知,Python会首先查看x
是否等于y
,而x
是否等于y
然后它会检查x
是否等于z
,如果至少有一个条件是Hello World!
,则打印True
。
如果我这样做:
if x in (y, z):
print("Hello World!");
据我所知,Python会遍历" yz"元组然后打印Hello World!
如果x
的值在" yz"元组。
使用哪种方法更快/更有效?
如果x
等于z
,Python是否会费心检查x
是否等于y
?
如果x
等于y
但不 z
,那么Python仍会在if语句中执行代码吗?
提前谢谢。
答案 0 :(得分:1)
对于两种选择,第一种选择更具可读性,二十种,第二种选择。表现不是一个真正的问题。
答案 1 :(得分:1)
让我们自己测试一下。
这是一个重载等于运算符的类,让我们看看Python在做什么:
class Foo:
def __init__(self, name):
self.name = name
def __eq__(self, other):
print self.name, "==", other.name, "?"
return self.name == other.name
让我们测试一下短路:
# x and a are passed the same string because we want x == a to be True
x = Foo("a")
a, b = Foo("a"), Foo("b")
if x in (a, b):
print "Hello World!"
对我来说,这会输出:
a == a ?
Hello World!
a == b ?
未打印,因此短路确实可以正常工作。该块也可以根据需要执行。
现在速度快。如果我们将上述__eq__
方法修改为删除print语句(以避免我们的基准测试中的I / O)并使用IPython的%timeit
魔术命令,我们可以通过这种方式进行测试:
c = Foo("c") # for comparison when x is not equal to either case
%timeit x in (a, b) # equal to first case
%timeit (x == a or x == b)
%timeit x in (b, a) # equal to second case
%timeit (x == b or x == a)
%timeit x in (b, c) # not equal to either case
%timeit (x == b or x == c)
这些是每次迭代的平均次数(从100万次迭代):
Code Time (ns)
x in (a, b) 437
x == a or x == b 397
x in (b, a) 796
x == b or x == a 819
x in (b, c) 779
x == b or x == c 787
所以,结果非常可比。虽然存在细微差别,但不足以担心。只需根据具体情况使用最具可读性的。
答案 2 :(得分:1)
当只有两个选项时,这实际上只是基于意见,但我想指出,如果你需要检查x
而不是说5个值会有更大的差异:
if x == a or x == b or x == c or x == d or x == e:
VS
if x in (a,b,c,d,e):
特别是如果您需要稍后将其更改为not in
与==
到!=
的所有内容,则第二个似乎更容易扩展。
答案 3 :(得分:0)
我很喜欢if x == y or x == z
:
如果x == z
,您可以利用x == y
将不进行评估的事实。
创建匿名临时元组可能是一种开销。
if x == y or x == z
在其他语言中也很常见,因此可能更具可读性。
也许好的python解释器可以优化匿名临时。
答案 4 :(得分:0)
我知道蟒蛇是一种懒惰的语言,如果他不需要,他不会检查第二个声明。但我不知道你的其他方法是否会更快。
如果x等于y,Python是否会费心去检查x是否等于z?
是的,Python不会检查它。
如果x等于y而不是z
,Python仍然会在if语句中执行代码
不,他不会。