我应该如何命令我的陈述和短路?
how should I order my statement in a short circuit and?
嗯,我正在做一个 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的右子树与B的左子树对称,那么我得出结论A,B是对称的
但是这段代码运行起来很慢:80ms 在 leetcode 上
但是如果我将 if 语句的顺序更改为:
if Issymmetric(A.left, B.right) and Issymmetric(A.right,B.left) and A.val == B.val:
return True
此代码具有相同的逻辑,但只需要 52ms,我假设比较根值应该在我详尽处理整个 left/right 子树之前完成(总的来说这样效率更高,可能会省去很多递归调用)
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 上的一个小故障,谢谢
Python if
语句将在出现第一个错误迹象时中断。 IE。
if a == True and b == True:
如果 a
为 False, 将中断,如果 a
为 True,将仅评估 b
。
因此,如果您像您一样进行一系列比较,并希望优化速度,请将最常见的情况放在首位。
这是一个有趣的问题,涉及到一些微妙的领域。
看条件的时候,看条件的速度,还要看它的辨别力。即,是否立即给出 "right" 答案,或者您是否需要继续查看其他条件。
根据多种因素,先有一个缓慢但有区别的条件可能更好。
考虑两个函数:
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
条件首先会导致(稍微)更短的总时间。
嗯,我正在做一个 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的右子树与B的左子树对称,那么我得出结论A,B是对称的
但是这段代码运行起来很慢:80ms 在 leetcode 上 但是如果我将 if 语句的顺序更改为:
if Issymmetric(A.left, B.right) and Issymmetric(A.right,B.left) and A.val == B.val:
return True
此代码具有相同的逻辑,但只需要 52ms,我假设比较根值应该在我详尽处理整个 left/right 子树之前完成(总的来说这样效率更高,可能会省去很多递归调用)
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 上的一个小故障,谢谢
Python if
语句将在出现第一个错误迹象时中断。 IE。
if a == True and b == True:
如果 a
为 False, 将中断,如果 a
为 True,将仅评估 b
。
因此,如果您像您一样进行一系列比较,并希望优化速度,请将最常见的情况放在首位。
这是一个有趣的问题,涉及到一些微妙的领域。
看条件的时候,看条件的速度,还要看它的辨别力。即,是否立即给出 "right" 答案,或者您是否需要继续查看其他条件。
根据多种因素,先有一个缓慢但有区别的条件可能更好。
考虑两个函数:
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
条件首先会导致(稍微)更短的总时间。