使用"如果x在(y,z)" over"如果x == y或x == z"?

时间:2016-06-06 12:48:54

标签: python performance python-3.x if-statement readability

考虑到这个简单的条件:

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语句中执行代码吗?

提前谢谢。

5 个答案:

答案 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

  1. 如果x == z,您可以利用x == y进行评估的事实。

  2. 创建匿名临时元组可能是一种开销。

  3. if x == y or x == z在其他语言中也很常见,因此可能更具可读性。

  4. 也许好的python解释器可以优化匿名临时。

答案 4 :(得分:0)

我知道蟒蛇是一种懒惰的语言,如果他不需要,他不会检查第二个声明。但我不知道你的其他方法是否会更快。

  

如果x等于y,Python是否会费心去检查x是否等于z?

是的,Python不会检查它。

  

如果x等于y而不是z

,Python仍然会在if语句中执行代码

不,他不会。