一个 Python 脚本从 20 秒到 0.8 秒:我做了什么

编程2025-07-06 · 阅读 8 分钟

起因是同事的一个数据处理脚本,跑一次要二十多秒,他怀疑是 Python 慢。我把代码拉下来跑了个 cProfile,结果一目了然:百分之九十的时间花在一个函数里,而那个函数在循环中反复打开同一个文件。

先看数据,再谈优化

任何优化之前先测量。cProfile 加上 snakeviz 可视化,五分钟就能看出热点在哪。如果凭直觉去改,很可能优化了一个只占百分之一时间的函数,白忙活。

真正的瓶颈

那个函数每次都 open() 一个配置 JSON,解析,用完丢掉,下一轮循环再来一遍。配置在运行期间根本不会变。把它提到循环外读一次,只这一步就从二十秒降到三秒。

# 之前
for item in items:
    cfg = json.load(open("config.json"))
    process(item, cfg)

# 之后
cfg = json.load(open("config.json"))
for item in items:
    process(item, cfg)

剩下的时间花在哪

剩下的时间主要在正则和字符串拼接。把几个固定模式的正则预编译一次,把循环里的 + 拼接改成 join,又省掉一秒多。最后加上一个进程池处理 IO 密集的部分,降到一秒以内。

最后

有意思的是,真正的提速来自“别重复做事”,而不是什么高级技巧。先把循环里不变的东西提出去,通常就能解决大半问题。算法层面的优化,往往是在这之后才需要考虑的事。

← 返回首页