两段代码只有几行不一样,且分散,如何优化?

比如:

if d_m > d_o:
    d1 = d_m
    sf_0 = scale_factor * 0.5
    sf_1 = scale_factor
    for i in range(20):
        # ... 省略
        if d < d1:
            # ... 省略
            sf_0 = sf
        else:
            sf_1 = sf
            break
else:
    d1 = d_o
    sf_0 = 0
    sf_1 = scale_factor * 0.5
    for i in range(20):
        # ... 省略
        if d < d1:
            # ... 省略
            sf_1 = sf
        else:
            sf_0 = sf
            break

相似度很高,但逻辑顺序不能变,这种能优化吗?

阅读 1.4k
avatarAI BotBETA

这段代码的确存在优化空间。由于sf_0sf_1的值只在for循环内部被改变,我们可以将这两个变量的赋值移出循环,从而减少代码重复。此外,我们也可以将两个for循环合并为一个,以进一步减少代码量。

优化后的代码如下:

if d_m > d_o:
    d1 = d_m
    sf_0 = scale_factor * 0.5
    sf_1 = scale_factor
else:
    d1 = d_o
    sf_0 = 0
    sf_1 = scale_factor * 0.5

for i in range(20):
    # ... 省略
    if d < d1:
        # ... 省略
        if d_m > d_o:
            sf_0 = sf
        else:
            sf_1 = sf
    else:
        if d_m > d_o:
            sf_1 = sf
        else:
            sf_0 = sf
        break

在这个版本中,我们保留了原始代码的逻辑顺序,同时减少了代码重复。这样可以使代码更简洁、易读,并可能提高运行效率。

4 个回答
d1, sf_0, sf_1 = (d_m, scale_factor * 0.5, scale_factor) if d_m > d_o else (d_o, 0, scale_factor * 0.5)
for i in range(20):
    # ... 省略
    if d < d1:
        # ... 省略
        sf_0 = sf
    else:
        sf_1 = sf
        break
def common(d1_v, sf_0_v, sf_1_v, d, sf, dm_gt_do):
    d1 = d1_v
    sf_0 = sf_0_v
    sf_1 = sf_1_v

    for i in range(20):
        # ... 省略
        if d < d1:
            # ... 省略
            sf_0 = sf if dm_gt_do else sf_1 = sf
        else:
            sf_1 = sf if dm_gt_do else sf_0 = sf
            break


if d_m > d_o:
    common(d_m, scale_factor * 0.5, scale_factor, d, sf, True)
else:
    common(d_o, 0, scale_factor * 0.5, d, sf, False)
新手上路,请多包涵

优化如下:

# 初始化变量  
d1 = d_m if d_m > d_o else d_o  
sf_0 = scale_factor * 0.5 if d_m > d_o else 0  
sf_1 = scale_factor if d_m > d_o else scale_factor * 0.5  
  
# 创建一个通用的循环  
for i in range(20):  
    if d < d1:  
        # 更新sf_0或sf_1,取决于之前的条件  
        if d_m > d_o:  
            sf_0 = sf  
        else:  
            sf_1 = sf  
    else:  
        # 更新sf_1或sf_0,并跳出循环  
        if d_m > d_o:  
            sf_1 = sf  
        else:  
            sf_0 = sf  
        break

snipaste_2024-04-07_12-46-02.png

Python 不熟,代码仅示意

def ffff(d1, sf_0, sf_1, posi):
    for i in range(20):
            if (d < d1 == posi):
                ef_0 = sf
            else:
                ef_1 = sf
                break
if d_m > d_o:
    ffff(d_m, scale_factor * 0.5, scale_factor, True)
else:
    ffff(d_o, 0, scale_factor, False)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题