嗯我正在做一个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的小故障,谢谢
答案 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
。
因此,如果您进行了一系列比较,并且想要优化速度,请先将最常见的案例放在首位。