cprofile 是定位 python 性能瓶颈的首选工具,应优先使用而非凭直觉优化;真实瓶颈多在 i/o、重复计算或低效数据结构,需结合 cumulative 和 ncalls 分析,避免误判。

先看 cProfile,别猜热点在哪
90% 的性能问题根本不在你怀疑的地方。Python 里最常犯的错,是凭直觉改代码——比如把列表推导换成 map,结果发现慢了 20%。真实瓶颈往往藏在 I/O、重复计算或低效数据结构里。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
python -m cProfile -s cumulative your_script.py跑一次,重点关注cumulative列(总耗时)和ncalls(调用次数),不是tottime - 避免只看顶层函数:
requests.get耗时高?可能是 DNS 解析、SSL 握手,或是下游服务响应慢,不是 Python 本身的问题 - 如果脚本启动慢,加
-m cProfile会干扰结果,改用import cProfile; cProfile.run('main()', sort='cumulative')精确包裹主逻辑
list.append 比预分配快?看场景
很多人听说“预分配列表更快”,就给 result = [None] * n,结果反而变慢。这取决于你是否知道最终长度、是否频繁访问中间索引、以及元素类型是否统一。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 不知道长度?坚持用
append。CPython 对list.append做了高度优化,扩容策略是乘数增长(~1.125x),均摊 O(1) - 已知长度且全是数字?考虑
array.array('d', [0.0] * n)或numpy.empty(n),内存更紧凑,迭代更快 - 预分配后用
result[i] = x写入,但后续又切片或pop()?那预分配没意义,还浪费内存
字符串拼接用 ''.join(),但别机械套用
看到“+”就换 join 是常见误区。Python 3.12 已对短链式 + 做了优化,少量字符串拼接反而更简洁安全。
ISkyShop开发团队历经4个月的设计研发,于 2014年2月28日推出V1.4正式版,V1.4版着重从UI设计、系统性能优化、微信商城功能完善入手,结合主流电商平台的用户体验,为电商运营商打 造一流的电商平台,V1.4版也是目前国内B2C2C中最优秀的平台之一。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 拼接 2–3 个变量?用
f"{a}{b}{c}"或a + b + c都行,可读性优先 - 循环内不断拼接?必须改:
parts.append(x)然后最后''.join(parts)。否则每次+=都新建字符串对象 - 涉及大量格式化(如日志、HTML 生成)?用
string.Template或jinja2,比反复join+format更可控
__slots__ 能省内存,但不提速
有人加了 __slots__ 就以为属性访问变快了,其实提升微乎其微(纳秒级),主要价值是防止动态绑定和减少每个实例的内存占用。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 类实例成千上万(如解析 CSV 后的每行对象)?加
__slots__可省 30%–50% 内存,尤其当属性少、实例多时 - 用了
@property或需要__dict__(比如用dataclasses.asdict())?别加__slots__,否则报AttributeError - 继承自内置类型(如
list、dict)?不能加__slots__,会触发TypeError
实际调优时,最容易被忽略的是「问题边界」:你优化的是单次运行、还是高频服务?是 CPU-bound 还是 I/O-bound?不先确认这点,所有 cProfile 数据、所有 <strong>slots</strong> 和 join 改动,都只是在替别人的问题加班。










