我应该如何在短路中订购我的陈述?

时间:2015-10-14 16:52:13

标签: python recursion short-circuiting

嗯我正在做一个question on leetcode to verify if something is a symmetric tree我有这一行代码:

if A.val == B.val and Issymmetric(A.left, B.right) and Issymmetric(A.right,B.left):
    return True

基本上如果A的根值与B的根值相同,并且A的左子树与B的右子树对称加上A' s右子树是与B的左子树对称,然后我得出结论A,B是对称的

然而这段代码在leetcode上运行速度很慢: 80ms 但如果我将if语句的顺序更改为:

if Issymmetric(A.left, B.right) and Issymmetric(A.right,B.left) and A.val == B.val:
    return True

这段代码具有相同的逻辑,但只需 52ms ,我有点假设在我彻底处理整个左/右子树之前应该比较根值(通常这样更有效率) ,它可以节省很多递归调用)

TL; DR 这让我觉得python以相反的顺序评估 短路和 ,所以我对我的本地环境做了一点测试:

def f1():
   print 1
   return True
def f2():
   print 2
   return True
if f1() and f2():
   pass
# but the output I got is 1,2...

我很困惑,如果短路的顺序是从左到右,为什么我的代码之间存在巨大的性能差异?

如果有必要,我可以上传我的整个IsSymmetric()函数 我做了一些进一步的测试,我认为80ms只是一个关于leetcode的小故障,谢谢

2 个答案:

答案 0 :(得分:1)

这是一个有趣的问题,涉及一些微妙的领域。

在查看条件以及条件的速度时,您需要了解它的区别。即,它会立即给出“正确”答案,或者如果您需要继续查看其他条件。

根据许多因素,首先要有缓慢但有辨别力的条件可能会更好。

考虑两个功能:

def f1(c):
    sleep(20)
    return (c % 2) == 0

def f2(c):
    sleep(25)
    return (c % 4) == 0

f1()速度快,但不是很有辨别力,而f2()速度较慢,但​​更具辨别力。考虑f1(c) and f2(c)

的两个表达式f2(c) and f1(c)经文c in 0..3
=== ===== ====
c   exp1  exp2
=== ===== ====
0   20+25 25+20
1   20+0  25+0
2   20+25 25+0
3   20+0  25+0
=== ===== ====
    130   120

请注意,slow条件首先会导致(略微)较短的总时间。

答案 1 :(得分:0)

Python if语句会在出现虚假的第一个迹象时中断。即。

if a == True and b == True:
如果a为假,则

会中断,并且只有b为真时才会评估a

因此,如果您进行了一系列比较,并且想要优化速度,请先将最常见的案例放在首位。