Python 3.x 使用三个IFs与使用IF-ELIF-ELSE相比:前者更快
我写了一个代码来查找。在尝试加快速度的同时,我发现使用3个IFs而不是IF-ELIF-ELSE可以加快代码的速度。我试着在n的多次迭代中运行代码,发现大多数情况下都是这样 我觉得IF-ELIF-ELSE应该更快,因为如果满足其中一个条件,它就不会进入其他条件。但我无法从实际发生的事情中找到任何逻辑 代码如下:Python 3.x 使用三个IFs与使用IF-ELIF-ELSE相比:前者更快,python-3.x,if-statement,python-3.5,Python 3.x,If Statement,Python 3.5,我写了一个代码来查找。在尝试加快速度的同时,我发现使用3个IFs而不是IF-ELIF-ELSE可以加快代码的速度。我试着在n的多次迭代中运行代码,发现大多数情况下都是这样 我觉得IF-ELIF-ELSE应该更快,因为如果满足其中一个条件,它就不会进入其他条件。但我无法从实际发生的事情中找到任何逻辑 代码如下: ugly = [0]*n ugly[0] = 1 i2, i3, i5 = 0, 0, 0 count = 1 while count<n: n2 = ugly[i2]*
ugly = [0]*n
ugly[0] = 1
i2, i3, i5 = 0, 0, 0
count = 1
while count<n:
n2 = ugly[i2]*2
n3 = ugly[i3]*3
n5 = ugly[i5]*5
next = min(n2, n3, n5)
if next==n2:
i2 += 1
elif next==n3:
i3 += 1
else:
i5 += 1
if next != ugly[count-1]:
ugly[count] = next
count += 1
ught=[0]*n
[0]=1
i2,i3,i5=0,0,0
计数=1
虽然count您的代码的两个版本计算结果的方式不同,因此它们花费的时间不同也就不足为奇了
使用if
/elif
/else
时,通常会多次计算相同的下一个值。例如,六可以计算为2*3
或3*2
。由于当6
是n2
,n3
,n5
中的最小值时,i2
,i3
,n5
中只有一个值会增加,i2
在第一次传递时会增加,然后在第二次传递时会增加i3
,因为n3
仍然是6。如果下一步!=丑陋的[count-1]:
检查将防止重复值在输出中结束,但您仍然需要额外运行循环体
使用多个if
s时,所有生成最小n
值的i
值将同时递增。这意味着您将只计算每个丑陋的数字一次,即使它可以通过几种不同的方式生成。避免额外的工作意味着代码运行得更快。如果下一步!=丑陋的[count-1]:
保护代码,因为您永远不会重复生成相同的值。您的两个版本的代码计算结果的方式不同,因此它们花费不同的时间应该不会太令人惊讶
使用if
/elif
/else
时,通常会多次计算相同的下一个值。例如,六可以计算为2*3
或3*2
。由于当6
是n2
,n3
,n5
中的最小值时,i2
,i3
,n5
中只有一个值会增加,i2
在第一次传递时会增加,然后在第二次传递时会增加i3
,因为n3
仍然是6。如果下一步!=丑陋的[count-1]:
检查将防止重复值在输出中结束,但您仍然需要额外运行循环体
使用多个if
s时,所有生成最小n
值的i
值将同时递增。这意味着您将只计算每个丑陋的数字一次,即使它可以通过几种不同的方式生成。避免额外的工作意味着代码运行得更快。如果下一步!=丑陋的[count-1]:
保护代码,因为您永远不会重复生成相同的值。不确定是否能够解释,但在我看来,您需要最快的方法和代码
- 调用
min
执行函数调用+循环+比较
- 然后将最小值与3个值中的2个进行比较
这是很多测试。专门为3个值调用min
,这太过分了
我重写了您的循环,没有使用min
(如果值相等,min
返回最左边的参数,作为Python 2的实现细节,现在保证用于Python 3),只使用不平等测试(链接操作符)
虽然count=n2=n3不确定是否能够解释,但在我看来,您需要最快的方法和代码
- 调用
min
执行函数调用+循环+比较
- 然后将最小值与3个值中的2个进行比较
这是很多测试。专门为3个值调用min
,这太过分了
我重写了您的循环,没有使用min
(如果值相等,min
返回最左边的参数,作为Python 2的实现细节,现在保证用于Python 3),只使用不平等测试(链接操作符)
当count=n2=n3时,也许你应该在代码评审时发布这个问题。我没有研究过你的代码产生的顺序,但是n2
,n3
或n5
是否可以彼此相等?如果是这样,您可能会从三个If
s中得到不同的结果(因为将匹配多个)。@Blckknght是的,n2
、n3
和n5
中的一些经常相等。很好。也许你应该在代码评论上发布这个问题。我还没有研究过你的代码生成的序列,但是n2
、n3
或n5
是否可以彼此相等?如果是这样,您可能会从三个If
s中得到不同的结果(因为将匹配多个)。@Blckknght是的,n2
、n3
和n5
中的一些经常相等。好的。
while count<n:
n2 = ugly[i2]*2
n3 = ugly[i3]*3
n5 = ugly[i5]*5
if n5 >= n2 <= n3:
next = n2
i2+=1
elif n5 >= n3 <= n2:
next = n3
i3 += 1
else:
next = n5
i5 += 1
# below: not changed
if next != ugly[count-1]:
ugly[count] = next
count += 1