在Python中优化if树
我有一个“如果决策树”,我想知道是否有可能优化它:在Python中优化if树,python,if-statement,Python,If Statement,我有一个“如果决策树”,我想知道是否有可能优化它: def s(a, b): """ :param a: 0,1,2 :param b: 0,1,2 :return: 0,1,2 """ if a == 0: if b == 0: return 2 elif b == 1: return 2 else: # b == 2
def s(a, b):
"""
:param a: 0,1,2
:param b: 0,1,2
:return: 0,1,2
"""
if a == 0:
if b == 0:
return 2
elif b == 1:
return 2
else: # b == 2
return 0
elif a == 1:
if b == 0:
return 2
elif b == 1:
return 2
else: # b == 2
return 1
else: # a==2
if b == 0:
return 0
elif b == 1:
return 1
else: # b==2
return 2
包括所有案例,我正在尝试使用(a,b)=(1,2)或(a,b)=(2,1)返回1
返回0时也是如此。其他情况返回2,但速度较慢
编辑:
我已经测试了(时间和有效期(全部有效))所有提议的“ifs”,并且:
s是我的显式函数
ss是第一个被提出的函数
sss是第二个建议的功能
等
这里我有个人资料:
只需通过比较元组明确检查这些值,并在所有其他情况下返回
2
:
v = (a, b)
if v == (1, 2) or v == (2, 1):
return 1
elif v == (0, 2) or v == (2, 0):
return 0
else:
return 2
你甚至可以更进一步,想想你的支票是做什么的:如果其中任何一个数字是2,你就返回另一个数字
if a == 2:
return b
elif b == 2:
return a
else:
return 2
通常,您也可以创建一个精确的映射,例如使用字典,它允许您直接查找结果(而不是使用复杂的if/else结构)。但是当你确定结果的逻辑真的适合一个句子时,那么你应该真正尝试以一种保持简洁逻辑完好无损的方式来实现它。否则,将很难发现错误(例如,我花了一段时间来验证if/else代码是否真的执行了您所说的操作)。当然,您可以在单元测试中始终使用这些不同的可能组合,以确保您的逻辑实际上涵盖了所有内容。如果您知道您不会得到a=3或b=-1,那么这里有一条直线:
def new_s(a,b):
return min(a,b) if max(a,b) == 2 else 2
我更喜欢用字典
mydict[0][0] = 2
mydict[0][1] = 2
mydict[0][2] = 0
mydict[1][0] = 2
mydict[1][1] = 2
mydict[1][2] = 1
mydict[2][0] = 0
mydict[2][1] = 1
mydict[2][2] = 2
print mydict[a][b]
如何创建dict of dict:
mydict = dict()
mydict[0] = dict()
mydict[0][1] = 2
是的,可以进行优化。您可以使用
和和或进行优化,但如果您担心优化if语句,您通常会考虑过度optimization@cricket_007我不同意。如果逻辑真的像OP在最后一句中写的那样简单,那么您应该能够准确地表示该逻辑。写出所有可能的案例并不是理解逻辑的好方法。而且它很容易出错,因为我需要多次查看以验证这些案例是否都是正确的。我这样写只是因为我需要检查是否所有的可能性都返回有效值。然后决定询问堆栈社区:)。如何制作两个整数键字典?这是口授的口授吗?我使用元组键,但我不确定这是否合适是的,这是dict of dict。在代码中添加了一个示例。@贝霍斯顿你也可以使用元组键,这很好。这是最慢的函数如果你从速度的角度谈论优化,那么你最好用numpy,Cython,第二个函数比显式的all if语句快一点