字符串拼接用 ''.join(),别用 +=;正则复用 re.compile();读大文件用 for line in file 迭代;json 解析用 json.loads()。

字符串拼接用 ''.join(),别用 +=
Python 中频繁用 += 拼接字符串,性能会断崖式下跌,尤其在循环里。因为字符串不可变,每次 += 都要分配新内存、复制旧内容,时间复杂度接近 O(n²)。
实操建议:
- 把所有待拼接的片段先放进
list,最后调用''.join(your_list) - 如果来源是生成器或大文件行流,用
itertools.chain或直接传给join(它接受任意可迭代对象) - 避免中间转成
str再拼:比如res += str(x) + ',' + str(y)→ 改成parts.append(str(x)); parts.append(','); parts.append(str(y))
常见错误现象:for line in lines: s += line.strip() + '\n' 处理 10 万行时可能卡住几秒;换成 lines = [line.strip() for line in lines]; s = '\n'.join(lines) 通常快 5–10 倍。
re.compile() 必须复用,别在循环里反复编译正则
每次调用 re.search()、re.findall() 等函数,如果传入的是字符串模式,Python 内部会查缓存;但缓存有上限(默认 512 条),且哈希冲突或冷启动时仍会触发编译。高频场景下,自己显式 re.compile() 并复用才是稳解。
立即学习“Python免费学习笔记(深入)”;
实操建议:
- 把正则对象提成模块级变量或类属性,比如
EMAIL_PATTERN = re.compile(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b') - 如果正则带动态部分(如用户输入的关键字),用
re.escape()包裹变量再拼接,然后编译,不要用f'{user_input}'直接插进re.search() - 注意
re.compile()的flags参数:比如处理多行文本时漏掉re.MULTILINE,^就只匹配开头,不是每行开头
性能影响:循环中调用 re.findall(r'\d+', text) 1 万次,比复用 re.compile(r'\d+') 慢 3–5 倍;若正则更复杂,差距更大。
系统简介:冰兔BToo网店系统采用高端技术架构,具备超强负载能力,极速数据处理能力、高效灵活、安全稳定;模板设计制作简单、灵活、多元;系统功能十分全面,商品、会员、订单管理功能异常丰富。秒杀、团购、优惠、现金、卡券、打折等促销模式十分全面;更为人性化的商品订单管理,融合了多种控制和独特地管理机制;两大模块无限级别的会员管理系统结合积分机制、实现有效的推广获得更多的盈利!本次更新说明:1. 增加了新
读大文件别用 file.read().splitlines()
看似方便,但会把整个文件一次性载入内存,哪怕只是想统计行数或找某几行。1GB 日志文件直接崩掉进程很常见。
实操建议:
- 用
for line in file:迭代器方式逐行处理,内存占用恒定在 ~1 行大小 - 需要跳过空行或注释?直接在循环里
if not line.strip() or line.startswith('#'):continue - 真要切片(比如取第 1000–1010 行)?用
itertools.islice(file, 999, 1010),不加载全文 - 避免
file.readlines()—— 它返回list,和read().splitlines()内存行为一致
兼容性提醒:Windows 换行符 \r\n 在 for line in file: 中会被自动归一为 \n,无需额外处理;但用 read() 后手动 split('\n') 可能漏掉 \r 边界问题。
JSON 解析优先用 json.loads(),别碰 ast.literal_eval()
有人图省事用 ast.literal_eval() 解析类似 JSON 的字符串,结果遇到 True/False/None 大小写不一致、单引号、尾部逗号就报错,还慢——它本质是 Python 表达式安全求值器,不是 JSON 解析器。
实操建议:
- 确认输入是标准 JSON(双引号、小写布尔值、无注释),就坚定用
json.loads() - 如果必须容忍单引号或注释,上
json5或pyyaml(后者需设Loader=yaml.CSafeLoader防注入),别硬扛ast - 解析超大 JSON 对象?用
ijson流式解析,避免全量加载到内存
容易踩的坑:用 ast.literal_eval("{'key': True}") 看似能跑,但换到 json.loads('{"key": true}') 才是跨语言通用做法;一旦数据来自前端或 API,ast 必挂。
真正难优化的从来不是单个操作,而是多个看似无害的 +=、嵌套的 re.search()、还有把整份日志塞进内存再 split() 的组合——这些地方堆起来,性能就不是线性下降,是雪崩。










