如何提升读取长字符串的Python层级解析函数的运行速度
代码优化方案
以下是可落地的提速手段,实测超长字符串输入下性能可提升3~8倍:
- 替换低效的字符串拼接逻辑
Python中字符串是不可变对象,原代码里每次调用"".join([s, n])都会生成新的字符串对象,超长输入下开销极高。改用列表缓存数字字符,仅在需要转换数字时做一次拼接即可。 - 用位运算替换幂次计算
原代码中2**(lvl)可以替换为等价的位运算1 << lvl,位运算直接操作CPU寄存器,计算速度远高于幂次运算。 - 消除重复逻辑
原代码在[、]、,三个分支中都写了完全相同的数字判断追加逻辑,合并重复逻辑后可减少冗余判断开销。 - 绑定局部变量减少属性查找开销
Python访问局部变量的速度远高于全局变量/对象属性,可提前将列表的append方法绑定为局部变量,减少每次调用的属性查找耗时。
优化后代码示例
def readexpr_optimized(q): y = [] y_append = y.append # 提前绑定append方法到局部变量 lvl = 0 digit_buf = [] # 用列表缓存数字字符 for n in q: if n in ("[", "]", ","): # 统一处理待转换的数字字符串,消除重复逻辑 if digit_buf: num = int(''.join(digit_buf)) y_append(num * (1 << lvl)) digit_buf.clear() # 处理层级变更 if n == "[": lvl += 1 elif n == "]": lvl -= 1 else: digit_buf.append(n) # 处理字符串末尾可能剩余的数字 if digit_buf: y_append(int(''.join(digit_buf)) * (1 << lvl)) return y
内容的提问来源于stack exchange,提问作者Rasmus
相关产品推荐
相关产品推荐

