Python 使用“是否更好?”;如果x在(y,z)中;超过;如果x==y或x==z";?

Python 使用“是否更好?”;如果x在(y,z)中;超过;如果x==y或x==z";?,python,performance,python-3.x,if-statement,readability,Python,Performance,Python 3.x,If Statement,Readability,鉴于这一简单条件: if x == y or x == z: print("Hello World!"); 我知道Python会首先查看x是否等于y,如果x不等于y,然后检查x是否等于z,打印你好世界如果至少有一个条件为真 如果我要这样做: if x in (y, z): print("Hello World!"); 据我所知,Python将遍历“yz”元组,然后打印helloworld如果x的值在“yz”元组中 使用哪种方法更快/更有效? 如果x等于y,Python会不会费

鉴于这一简单条件:

if x == y or x == z:
    print("Hello World!");
我知道Python会首先查看
x
是否等于
y
,如果
x
不等于
y
,然后检查
x
是否等于
z
,打印
你好世界如果至少有一个条件为

如果我要这样做:

if x in (y, z):
    print("Hello World!");
据我所知,Python将遍历“yz”元组,然后打印
helloworld
如果
x
的值在“yz”元组中

使用哪种方法更快/更有效?
如果
x
等于
y
,Python会不会费心检查
x
是否等于
z
如果
x
等于
y
,但不是
z
,Python还会执行if语句中的代码吗


提前谢谢。

如果x==y或x==z,我会选择

  • 您可以利用这样一个事实:如果
    x==y
    ,则不会对
    x==z
    进行计算

  • 创建匿名临时元组可能会带来开销

  • 如果x==y或x==z在其他语言中也很常见,因此可能更具可读性


  • 也许一个好的python解释器可以优化匿名临时语句。

    我知道python是一种懒惰的语言,如果不需要的话,他不会检查第二条语句。但我不知道你的其他方法是否会更快

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

    是的,Python不会检查它

    如果x等于y而不是z,Python还会执行if语句中的代码吗


    不,他不会的。

    对于两种选择,第一种更具可读性,对于二十种,第二种。性能不是真正的问题。

    让我们自己测试一下

    下面是一个重载相等运算符的类,让我们看看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?
    未打印,因此短路可以按需要工作。该块也根据需要执行

    现在谈谈速度。如果我们修改上述
    \uuu eq\uuu
    方法以删除打印语句(以避免基准测试中的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万次迭代开始):


    所以,结果相当相似。虽然有点不同,但还不足以让人担心。只需根据具体情况使用可读性最好的选项。

    当只有两个选项时,这实际上只是基于意见,尽管我想指出,如果您需要对照5个值检查
    x
    ,则会有更大的差异:

    if x == a or x == b or x == c or x == d or x == e:
    
    vs:


    特别是如果您以后需要将其更改为
    不在
    中,而将所有
    ==
    更改为
    =第二个问题似乎更容易展开。

    对于第一个问题,您始终可以进行基准测试。第二个问题我不太清楚。你可以测试第三个问题。这是关于效率的讨论。集合在{y,z}
    中也是一个选项。我无法想象它会有什么真正的区别。如果是的话,你可能应该用C。当在(y,z)中检查
    x时,
    它只会检查
    x==z
    如果x不等于y,那么你的第一点就不是什么大问题了。谢谢你的回答,谢谢你的回答。
    x,y,z=x(“x”),
    x(“z”)
    x(“z”)
    你可能想做中间的
    x(“y”)
    ?@tadhgmdonald Jensen否,因为我希望等式运算符在这种情况下计算为
    True
    。可能类名和字符串值有点混淆。现在我将添加一条注释来解释它。如果它们不直接表示变量名,我将使用
    a
    b
    作为字符串,因为是的这真的很让人困惑。另外告诉我,你在计时之前删除了
    \uuuu eq\uuuu
    中的print语句了吗?@tadhgmald Jensen我同意。我会将字符串值更新为这些值。谢谢。是的,我删除了print语句(我在
    %timeit
    命令之前提到了它)。谢谢你的回答和测试,谢谢:)Python本身不是一种懒惰的语言
    被定义为短路运算符,仅在需要定义整个表达式时才计算第二个参数。是的,这就是我想说的谢谢你的回答,谢谢。谢谢你的回答,谢谢。亲爱的佩里,正如Alex Bowe之前的回答所示,第二句话很准确。因此第一句话就足够了。谢谢你的回答,谢谢。
    if x == a or x == b or x == c or x == d or x == e:
    
    if x in (a,b,c,d,e):