代码之家  ›  专栏  ›  技术社区  ›  Rajdeep Sindhu

逻辑运算符和它们对应的链式if条件之间有什么区别?

  •  3
  • Rajdeep Sindhu  · 技术社区  · 1 年前

    我是python的初学者,我在学习逻辑运算符。

    比方说,我们有两个布尔表达式, c1 c2 。我们可以定义一个函数

    def and_operator(c1,c2):
        if (c1 == False):
            return False
        elif (c2 == False):
            return False
        else:
            return True
    

    此函数提供的输出与 and 运算符应用于 c1 c2 会给予。

    那么,在基本层面上,这两种方法的工作方式有什么区别吗? 除了后者使代码更易于编写和阅读之外,这两种方法之间有什么区别吗?

    4 回复  |  直到 1 年前
        1
  •  1
  •   Marcin Orlowski    1 年前

    这个 and 如果第一个表达式为 False ,因为它已经知道最终结果会是 错误 不管怎样。然而,您的函数会提前评估这两个条件,这可能会导致不必要的计算,尤其是在 c2 价值来源于繁重的计算、复杂或资源密集型的操作。

        2
  •  0
  •   AmaanK    1 年前

    区别在于cpu级别。现在的CPU带有专用的逻辑操作指令。如果你使用它们,你可以显著地加快你的代码。这就是为什么 and 在python和大多数其他语言中实现了运算符。而你的方法也是 逻辑上 正确,但它有性能缺陷。首先,代码将有多个 jmp (跳转)CPU级别的语句,因为您正在使用if else等条件。第二个问题是,Python确实很慢。所以用你的方式编写它也会导致更多的性能缺陷。现在想想看,什么会更有益

    1. 具有在单个cpu周期内完成执行的单个指令
    2. 有一个大的至少几百条指令集,在多个cpu周期后完成

    当然,每个人都会选择选项1,这就是我们使用and运算符的原因。甚至python解释器本身也使用其父语言C.C定义的and运算符。C内部使用汇编程序定义的and操作符。而且,汇编程序使用CPU定义的“and”指令。

    没有定义“和”这回事。它是在硬件级别定义的。

    至于性能,我们来看看:

    import timeit
    
    def and_operator(c1,c2):
        if (c1 == False):
            return False
        elif (c2 == False):
            return False
        else:
            return True
    
    def f1():
        a = True
        b = True
        this = a and b
        return this
    
    def f2():
        a = True
        b = True
        this = and_operator(a, b)
        return this
    
    
    t1 = timeit.timeit(f1)
    t2 = timeit.timeit(f2)
    
    print("Time 1: ", t1)
    print("Time 2: ", t2)
    
    print("Time 1 is", t2/t1, "times faster than Time 2")
    

    该输出:

    Time 1:  0.05105140000523534
    Time 2:  0.1449641000072006
    Time 1 is 2.8395714905435403 times faster than Time 2
    

    奇怪的是,python优化了我的测试代码,因此系数只有2.8,事实上,如果python没有优化我的测试码,这个系数可能会在100左右。

        3
  •  -1
  •   Yahav Nir    1 年前

    在我看来,使用AND运算符有其好处: 1) 广为人知且易于“新”编码器理解。 2) 将更好地适用于不同类型的变量,您的代码仅适用于布尔值。 3) 短周期评估

        4
  •  -2
  •   Luix    1 年前

    逻辑运算符和链式if条件都可以获得类似的结果,但它们之间存在一些差异:

    逻辑运算符是内置的符号,如和、或,而不是直接对布尔值(True或False)进行运算。它们计算两个操作数,并根据特定运算符的逻辑返回单个布尔结果(例如,仅当两个操作都为True时才返回True)。它们通常执行短路求值,这意味着一旦能够确定最终结果,就停止求值操作数。例如,如果第一个操作数为False,则停止计算第二个操作数。如果一个操作数的计算成本很高,这可以提高效率。 链式if条件:它们按顺序评估每个条件,而不管结果是否已经确定。如果某些条件的计算成本很高,这可能会降低效率 链式if条件涉及一个接一个地使用多个if语句,按顺序检查每个条件。每个if语句的代码块仅在其条件为True时执行。如果任何条件为False,则跳过剩余的If语句。由于它们的简洁性、可读性和短路评估的潜在效率,它们通常是简单表达式的首选语句。如果条件语句更适合复杂逻辑,或者当您需要对求值流进行更多控制时,则链接。

    推荐文章