【问题标题】:Any difference between those comparisons in python?python中的这些比较有什么区别吗?
【发布时间】:2014-07-18 14:05:04
【问题描述】:

例如,我们持有六个具有成对值的变量。

a, b, c = 1, 2, 3
z, x, v = 1, 2, 3

基本上,我们使用== & and 运算符进行多重比较;

In [6]: a == z and b == x and c == v
Out[6]: True

但是我们可以在没有and逻辑运算符的情况下进行比较,比如;

In [10]: (a,b,c) == (z,x,v)
Out[10]: True

In [31]: all([(a == z), (b == x), (c == v)])
Out[31]: True

所有用法响应相同。但我想知道这些比较方法之间是否有任何区别,比如逻辑、操作、不同类型值的不同响应等等?

【问题讨论】:

    标签: python comparison operators difference


    【解决方案1】:

    它们都会产生相同的结果(假设在计算值或比较它们时没有抛出异常)。

    但它们的计算方式不同。如果发现不相等的对,这个会停止,因此不会比较所有对:

    a == z and b == x and c == v
    

    如果被比较的值实际上是函数调用,那么如果最终结果不需要这些函数,则不会调用这些函数。

    其他两种形式将执行所有计算,因为您正在构建元组和值列表:

    (a,b,c) == (z,x,v)                       # makes two tuples of values
    all([(a == z), (b == x), (c == v)])      # makes a list of values
    

    【讨论】:

    • (a,b,c) == (z,x,v)all([(a == z), (b == x), (c == v)]) 之间存在差异。第一个使比较短路,而第二个则执行所有比较。为了使第二个元素短路,可以使用生成器表达式:all(((a == z), (b == x), (c == v)))(不过,对于仅 3 个元素来说,这很可能会更慢)。
    • True:元组版本计算所有值,但会使比较短路。
    【解决方案2】:

    我不认为,三种给定的比较方法之间存在逻辑差异。虽然我更喜欢第一种方法,但我认为它更容易理解。但是,由于必须调用不同的强制转换,因此可能仍然存在一些执行时间差异。

    所以我看了一下时差:

    import time
    
    a, b, c = 1, 2, 3
    z, x, v = 1, 2, 3
    
    iterations = 1000000
    
    start = time.time()
    for i in range(iterations):
      a == z and b == x and c == v
    end = time.time()
    print end - start
    
    
    start = time.time()
    for i in range(iterations):
      (a,b,c)==(z,x,v)
    end = time.time()
    print end - start
    
    
    start = time.time()
    for i in range(iterations):
      all([(a==z), (b==x), (c==v)])
    end = time.time()
    print end - start
    

    输出:

    0.268415212631
    0.283325195312
    0.413020133972
    

    所以基本上第一种方法是最快的。这很容易想象,因为不必执行“强制转换”。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 2011-01-14
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多