Python 脚本运行慢怎么办:先从这几类问题排查
不讲空泛调优,直接从文件读取、循环、数据结构、重复计算、接口请求和批量处理几个方向排查 Python 脚本性能问题。
相关工具
先确认慢在哪里
Python 脚本慢,不要一上来就换框架、换语言。先确认慢在哪里:是读文件慢,处理循环慢,网络请求慢,还是写结果慢。很多脚本真正耗时的是接口请求、磁盘读写或重复解析文件,而不是 Python 语法本身。
可以先用最简单的计时方式定位:
from time import perf_counter
start = perf_counter()
# 这里放你要测试的代码
end = perf_counter()
print(f"耗时:{end - start:.3f} 秒")把读取、处理、输出分开计时,你就能知道该优化哪一段。没有定位之前的优化,基本是在猜。
别在循环里反复做昂贵操作
循环里最容易藏性能问题。比如每处理一行就打开一次文件,每处理一条数据就重新读取配置,每次循环都编译正则,每次都从列表里查找同一个 ID。这些动作单次不明显,放大到几万条就慢了。
正则可以提前编译:
import re
pattern = re.compile(r"ERROR|WARN")
for line in lines:
if pattern.search(line):
print(line)字典索引也应该提前建好。比如要按用户 ID 补资料,不要每条订单都遍历一遍用户列表。先把用户列表变成 user_map,再查询。
大文件不要一次性全读进内存
小文件直接 read 没问题,大文件就要逐行处理。日志、CSV、导出数据可能有几百 MB,全部读进内存会卡住甚至崩溃。逐行读取更稳,也方便边处理边输出。
示例:
with open("app.log", "r", encoding="utf-8", errors="ignore") as f:
for line in f:
if "ERROR" in line:
print(line.strip())如果要处理 CSV,可以考虑 csv 模块逐行读。数据分析场景再考虑 pandas 分块读取。先让脚本能稳定跑完,再考虑速度。
网络请求慢要看并发、超时和重试
如果脚本要请求很多接口,慢通常不在 Python 循环,而在网络等待。每个请求等 1 秒,1000 个请求就是很长时间。此时要设置 timeout,记录失败原因,必要时再考虑并发。不要没有超时地一直等,也不要失败后无限重试。
基础请求要加超时:
import requests
try:
response = requests.get("https://api.example.com/data", timeout=10)
print(response.status_code)
except requests.Timeout:
print("请求超时")如果脚本已经变成正式任务,服务器、数据库和网络稳定性也会影响执行效率。需要部署定时任务或接口服务时,可以结合云服务器资源规划,阿里云官方活动页可以作为参考:https://www.aliyun.com/daily-act/ecs/activity_selection?userCode=hzn6nvhm 。
常见问题
Python 慢是不是一定要换语言?
不一定。先定位瓶颈,很多问题来自文件读写、网络请求、数据结构选择和重复计算。
大文件应该怎么读?
优先逐行读取或分块读取,不要一次性全部读入内存。
接口请求很慢怎么办?
先加 timeout 和日志,确认是网络等待还是服务端慢,再考虑并发和重试策略。