XPerf
语言Python

Python 性能指南(v0)

少做平方级 builder,让热路径更安静。

范围:CPython 3.10+。 加速数字会标明本地 bench、上游来源,或标为暂定。语料库残留计数是 lint 命中次数,不是墙钟耗时节省。

先画像(timeit、py-spy、cProfile)。PyPy 与其他 VM 不同——请重测。

目录

1. 字符串与列表

循环里的 s += piece 在 CPython 上是平方级的。优先 ''.join(...) 或 io.StringIO。反复 xs = xs + [item] 同样会拷贝;优先 append。

Lint: pp-str-plus-hot(默认 off,G3 后); pp-list-plus-rebind(默认 hint)

2. 热 I/O

紧密循环里的 print 会刷新并格式化。门控调试输出或做缓冲。

Lint: pp-print-hot(默认 off,G3 后)

3. 解析与深拷贝

循环里的 json.loads / json.dumps 与 deepcopy 会重复本可在循环外完成的工作(当值不变时)。变化的 payload 不能外提。这些 lint 是 hint,并有微基准。re.compile 已移除:CPython 会缓存,测得差距低于 3×。datetime.strptime / strftime 已移除:固定字符串仅在跳过调用时更快,变化的字符串没有可外提的东西。

循环里对同一路径 open 会反复打开。某一测量形态(1 字节文件)约 409×。每轮都变的路径不能外提。time.perf_counter_ns 约 2.9×,getattr 约 1.4×;已检查但未给规则。

Lint: pp-json-hot, pp-deepcopy-hot, pp-open-hot(默认 hint)

Lint 对照

IDSmell默认
pp-str-plus-hot循环内字符串 +=off(G3)
pp-list-plus-rebind循环内 list + 重绑定hint
pp-print-hot循环内 print(off(G3)
pp-json-hot循环内 json.loads / dumpshint(有测量;未 corpus 分级)
pp-deepcopy-hot循环内 deepcopyhint(有测量;未 corpus 分级)

仅在有 evidence/pp-*.jsonl 时升级——见 evidence-policy.md。临时的 re.METHOD(literal) 规则(PP004)已移除;见 rule-ids.md。pp-regex-compile-in-loop 与 pp-datetime-format-in-loop 已移除。

参考资料