Python 如何优化if语句给定if语句有:>;或<;
如何使与下面类似的代码运行得更快 我知道你可以用一本字典来解释等式if语句,但这本字典不确定Python 如何优化if语句给定if语句有:>;或<;,python,if-statement,Python,If Statement,如何使与下面类似的代码运行得更快 我知道你可以用一本字典来解释等式if语句,但这本字典不确定 Delta = 3 if (x - y) >= Delta: pass elif y < Delta: pass else: pass Delta=3 如果(x-y)>=Delta: 通过 elif y
Delta = 3
if (x - y) >= Delta:
pass
elif y < Delta:
pass
else:
pass
Delta=3
如果(x-y)>=Delta:
通过
elif y
下面是一个示例,说明如果您真的想使用字典查找,这里的字典查找会是什么样子:
def do_something():
pass
def do_something_else_1():
pass
def do_something_else_2():
pass
{
y < Delta: do_something_else_1,
x - y >= Delta: do_something
}.get(True, do_something_else_2)()
def do_something():
通过
def dou_some_other_1():
通过
def dou_some_other_2():
通过
{
y
但我可以向您保证,这将运行得更慢(主要是因为所有条件现在都是贪婪地评估的,而不是懒惰地评估的)。无法使用字典查找优化现有代码的原因是,在计算哈希值,然后使用缩小的搜索空间计算相等值比使用整个搜索空间计算相等值快的情况下,字典查找更为出色。由于这一好处,您首先必须支付构建哈希表的前期成本
但是,这里没有检查平等性。您使用的是不等式函数
=
,这与哈希表的概念不符。与使用bool
本身相比,bool
的散列(此不等式函数的结果)的计算速度并不快,这意味着在此处构建散列表将超过随后立即使用构建的散列表所节省的时间。由于x
和y
每次都可能发生变化,因此您无法缓存此哈希表,这意味着您每次都要承担构建成本
保持代码原样。优化通常利用一些常用表达式或通用代码。你这里一个也没有。在寄存器级别,您的比较如下所示:
load r1, x
sub r1, y
sub r1, 3
brlt ELIF # if less than 0, branch to ELIF
# TRUE-clause stuff, aka "Do something"
br ENDIF
ELIF:
load r1, y
sub r1, 3
brge ELSE # if >= 0, branch to ELSE
# ELIF-clause stuff, aka "Do something else #1"
ELSE:
# ELSE-caluse stuff, aka "Do something else #2"
ENDIF:
# Remainder of program
在数据或流中,her的唯一共同点是将y
加载到寄存器中。任何合理的优化级别都可以为您做到这一点——它将改变第一个表达式,将y
加载到r2
,这在微指令利用率方面是一个微不足道的成本
这里似乎没有其他要优化的内容。正常流分析将认识到
3
在此块中是一个常数,并用立即数替换Delta
为什么您认为它可以运行得更快?请提供您如何设想它运行得更快的描述,例如用汇编语言或类似的低级指令。我没看到。什么是x
和y
?如果是数字,我会说“不用麻烦了”。如果doother
的两个子句都是相同的“other”,那么你的elif
子句就是在浪费时间和空间。每个人,我想他都在想,是否有类似于分派表的东西,可以用于类似switch/case的代码。简单的答案是,在进行不平等性比较时,没有任何相似之处。