Python 3.x 使用三个IFs与使用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]*

我写了一个代码来查找。在尝试加快速度的同时,我发现使用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]*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
中的一些经常相等。很好。也许你应该在代码评论上发布这个问题。我还没有研究过你的代码生成的序列,但是n2n3n5是否可以彼此相等?如果是这样,您可能会从三个
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