我该如何在短路和短路的情况下对我的陈述进行排序?

2024-04-26 14:52:35 发布

您现在位置:Python中文网/ 问答频道 /正文

嗯,我正在做一个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是对称的

但是,此代码运行非常慢:leetcode上的80ms 但是如果我把if语句的顺序改为:

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

这段代码具有相同的逻辑,但只需要52毫秒,我有点假设在彻底处理整个左/右子树之前,应该先比较根值(一般来说,这样效率更高,可能会节省大量递归调用)

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...

我很困惑,如果短路的顺序是从左到右,为什么我的代码之间会有巨大的性能差异?你知道吗

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


Tags: and代码righttruereturnif顺序is
2条回答

这是一个有趣的问题,涉及到一些微妙的领域。你知道吗

当你观察一个条件,以及条件的速度时,你需要观察它的辨别能力。也就是说,它是否立即给出了“正确”的答案,或者你是否需要继续研究其他条件。你知道吗

最好先有一个缓慢但有区别的情况,这取决于许多因素。你知道吗

考虑两个功能:

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条件如何首先导致(稍微)较小的总时间。你知道吗

Python if语句在第一次出现错误时就会中断。例如

if a == True and b == True:

如果a为False,则中断,如果a为True,则只计算b。你知道吗

所以,如果你有一系列的比较,就像你做的,并且想要优化速度,把你最常见的情况放在第一位。你知道吗

相关问题 更多 >