绝大多数情况下不值得,除非确认是瓶颈且优化后有可测量收益;微优化如sum()换math.fsum()、str.join()前检查空列表、is替==等实际影响几乎为零,真正应关注perf_counter测出>1ms的热点路径及算法级问题。

绝大多数情况下不值得,除非你已经确认它是瓶颈,且优化后能带来可测量的收益。
微优化常出现在哪些函数调用上
比如 sum() 换成 math.fsum()、str.join() 前手动检查空列表、用 is 替代 == 判等。这些改动看似“更正确”,但实际影响几乎为零——CPython 解释器对常见操作做了大量底层优化,sum() 在小数据量下比手写循环快,str.join([]) 本身无异常,根本不需要提前 guard。
- 真正该盯的是
time.perf_counter()测出耗时 >1ms 的热点路径 -
is替==只在确定对象身份一致时安全(如跟None、True比),乱用会埋逻辑 bug -
math.fsum()精度高,但慢 10 倍以上,浮点累加误差不到 1e-15 的场景完全没必要
profile 后发现 list.append() 占了 8% 时间怎么办
先别急着换 array.array 或预分配 list 长度。8% 是绝对值还是相对值?如果总耗时是 2ms,那它只花了 0.16ms——此时优化只会让代码更难读,还可能引入边界错误。真正的信号是:单次 append() 平均耗时突增,或调用次数远超预期(比如本该 O(n) 却跑出 O(n²) 行为)。
- 用
python -m cProfile -s cumtime your_script.py看累积时间,不是占比 - 检查是否在循环里反复创建 list 导致重复扩容,而不是
append本身慢 - 预分配只在长度确定且较大(>10k)时有实感收益;小列表反而因内存浪费拖慢 GC
用 __slots__ 节省内存是否影响兼容性
会影响:一旦加了 __slots__,实例就不能动态绑定新属性,也不能被 __dict__ 序列化,很多调试工具、ORM、dataclass 衍生类会直接报错。
立即学习“Python免费学习笔记(深入)”;
- 只在明确要创建数十万以上实例,且属性集完全固定时考虑
-
__slots__不减少单个实例内存,而是去掉__dict__和__weakref__的开销,省的通常是几百字节 - 继承链中只要有一个父类用了
__slots__,子类也得显式声明,否则报TypeError
微优化最危险的地方不是没效果,而是它让你停止思考更高阶的问题:算法复杂度、IO 阻塞、缓存失效、锁竞争……那些地方动一动,性能变化是百倍起跳。而你还在为 x * 0.5 改成 x / 2 查文档。










