使用多变量的嵌套循环如何简化,让代码更短更易读?
代码优化方案
1. 初始值为0的参数统一初始化方法
- 短变量列表直接用连等赋值:
m = n = t = u = w = 0,一行即可完成多个同值变量的初始化,不需要逐行声明 - 变量数量较多时可以用列表解包:
m, n, t, u, w, o, l, p, r, s = [0]*10,只需要修改后面的列表长度即可适配任意数量的0值初始化需求
2. 两层循环精简改写
版本1:保留原有循环逻辑,仅精简冗余代码(可读性最高,逻辑和原代码100%对齐)
import numpy as np import math # 提前生成公共基础x序列,避免循环内重复创建 base_x = np.linspace(voltage_min, voltage_max, ids_per_pad) # 提前把数学表达式转为可调用函数,避免循环内重复eval def calc_y(a, b, c, x): return eval(math_fun) current = [] voltage = [] for device_idx in range(rows * columns): # 直接用迭代次数计算累加偏移,省去逐个变量+=操作 base_m = shift_horizontal_per_device * (device_idx + 1) base_n = shift_vertical_per_device * (device_idx + 1) base_t = shif_param_a_per_device * (device_idx + 1) base_u = shif_param_b_per_device * (device_idx + 1) base_w = shif_param_c_per_device * (device_idx + 1) for pad_idx in range(pads): o = shift_horizontal_per_pad * (pad_idx + 1) l = shift_vertical_per_pad * (pad_idx + 1) p = shif_param_a_per_pad * (pad_idx + 1) r = shif_param_b_per_pad * (pad_idx + 1) s = shif_param_c_per_pad * (pad_idx + 1) # 直接计算x和y x = base_x + o + base_m y = calc_y(base_t + p, base_u + r, base_w + s, base_x) + base_n + l voltage.extend(x) current.extend(y)
版本2: numpy向量化改写(完全去掉显式循环,代码更短性能更高,适合大数据量场景)
import numpy as np import math base_x = np.linspace(voltage_min, voltage_max, ids_per_pad) def calc_y(a, b, c, x): return eval(math_fun) # 生成所有device的偏移量 device_cnt = rows * columns device_m = shift_horizontal_per_device * np.arange(1, device_cnt + 1) device_n = shift_vertical_per_device * np.arange(1, device_cnt + 1) device_t = shif_param_a_per_device * np.arange(1, device_cnt + 1) device_u = shif_param_b_per_device * np.arange(1, device_cnt + 1) device_w = shif_param_c_per_device * np.arange(1, device_cnt + 1) # 生成所有pad的偏移量 pad_o = shift_horizontal_per_pad * np.arange(1, pads + 1) pad_l = shift_vertical_per_pad * np.arange(1, pads + 1) pad_p = shif_param_a_per_pad * np.arange(1, pads + 1) pad_r = shif_param_b_per_pad * np.arange(1, pads + 1) pad_s = shif_param_c_per_pad * np.arange(1, pads + 1) # 广播计算所有x、y total_x = (base_x[None, None, :] + pad_o[:, None] + device_m[:, None, None]).ravel() a = (device_t[:, None] + pad_p).ravel()[:, None] b = (device_u[:, None] + pad_r).ravel()[:, None] c = (device_w[:, None] + pad_s).ravel()[:, None] total_y = (calc_y(a, b, c, base_x) + (device_n[:, None] + pad_l).ravel()[:, None]).ravel() voltage = total_x.tolist() current = total_y.tolist()
优化点说明
- 删掉了所有不必要的累加变量,固定步长的累加值直接通过迭代次数乘以步长计算,逻辑更直观
- 公共操作提前到循环外执行,减少重复计算开销
- 变量命名更清晰,不需要额外注释就能看懂对应含义
- 向量化版本彻底去掉了Python层面的循环,运行速度比原循环快10~100倍(依数据量而定)
注意:原代码中的
shif_param系列变量名疑似拼写错误(缺了一个t,应为shift_param),请根据实际变量名自行修正。
内容的提问来源于stack exchange,提问作者Jerzy
相关产品推荐
相关产品推荐

