应使用 ”.join() 拼接字符串、re.compile() 预编译正则、逐行读取大文件、str.translate() 替代多层 replace(),四者均显著提升性能。

字符串拼接用 ''.join() 而不是 +=
python 中字符串不可变,+= 每次都会创建新对象,时间复杂度是 O(n²);而 ''.join() 是单次遍历、预分配内存,O(n)。尤其在循环中拼接上百个字符串时,性能差距可达 10 倍以上。
- 错误写法:
s += word在 for 循环里反复调用 - 正确写法:先收集到
parts = [],最后''.join(parts) - 注意:如果只有 2–3 次拼接,
+=差异可忽略;但逻辑不确定长度时,统一用join
正则匹配优先用 re.compile() 编译模式
重复使用的正则表达式不编译,每次调用 re.search() 或 re.findall() 都会隐式编译一次,开销显著。编译后复用对象,能减少解析和优化正则 AST 的成本。
- 高频场景如日志行解析、csv 字段清洗,必须提前
pattern = re.compile(r'd{4}-d{2}-d{2}') - 编译后的
pattern支持pattern.sub()、pattern.match()等方法,语义更清晰 - 避免在函数内反复
re.compile()—— 即使加了缓存,也建议提至模块级变量
大文件逐行读取,别用 file.read().splitlines()
file.read() 会把整个文件加载进内存,几 GB 的文本直接触发 MemoryError;而逐行迭代(for line in file:)是生成器行为,内存占用恒定在 ~1 行大小。
- 需要跳过空行或注释?用
if line.strip() and not line.startswith('#'):过滤,别先全读再 Filter - 若需随机访问某行,考虑
linecache.getline(),而非缓存全部内容 - 配合
io.TextIOWrapper显式指定encoding和buffering(如buffering=8192),避免默认小缓冲拖慢 I/O
str.translate() 替代多层 str.replace()
连续调用 5 次 replace() 会扫描字符串 5 遍;而 str.translate() 基于查表,单次遍历完成所有字符映射,速度通常快 3–8 倍,特别适合清洗标点、大小写归一、ASCII 过滤等场景。
立即学习“Python免费学习笔记(深入)”;
- 构建映射表:
table = str.maketrans('', '', '.,!?')(删除字符)或{ord('a'): 'A'}(替换) - 调用:
clean_text = text.translate(table) - 注意:
translate()只处理单字符,不能替代正则的上下文匹配(如“仅替换单词边界的 ‘and’”)
实际处理百万行日志或 GB 级文本时,上述四点中任意一点漏掉,都可能让脚本从秒级退化到分钟级——尤其是 translate() 和 join() 这类看似微小的选择,影响往往藏在最热的那条执行路径里。