Python Pandas中Lambda结合requests运行过慢如何优化
问题根因
你代码运行慢的核心原因是存在大量冗余HTTP请求和无效的全量DataFrame操作:
- 你已经在for循环中对每个站点发起了一次GET请求并拿到了响应结果,但
apply中又对所有站点重复发起了一次GET请求,每个站点至少会被请求2次,若循环内多次触发判定条件,请求次数还会成倍增长 - 只要有一个站点满足判定条件,就会对整个
newdf的Login列做全量重算,大量重复操作完全没有必要
优化后代码
import pandas as pd import requests from requests.exceptions import HTTPError # 读取数据 lista = pd.read_csv('sites4.csv', sep=',') df = pd.DataFrame(lista, columns=['Site', 'Login']) newdf = df.assign(Site=df['Site'].map(str) + 'Login') headers = {'Content-Type': 'application/json'} # 开启会话复用,大幅提升请求速度 session = requests.Session() session.headers.update(headers) login_res = [] for site in newdf['Site']: is_login = 'no' try: result = session.get(site, timeout=5) # 保留你原有的业务判断逻辑 if 'application/json' in result.headers.get('Content-Type', '') or result.status_code in (406, 403): if result.status_code == 200: is_login = 'yes' print(site + ' é Login') print(result) except HTTPError as http_err: print(f'HTTP error occurred: {http_err}') except Exception as err: print(f'Other error occurred: {err}') login_res.append(is_login) # 一次性赋值给Login列 newdf['Login'] = login_res
核心优化点
- 用
requests.Session()复用TCP连接,减少HTTP握手的开销,请求速度可以提升30%以上 - 完全取消了冗余的
apply全量重算逻辑,每个站点仅发起1次GET请求,直接复用已拿到的响应结果做判定 - 用列表存储每个站点的判定结果,最后一次性赋值给
Login列,避免循环内频繁修改DataFrame带来的性能损耗 - 异常场景也会明确赋值
no,避免出现空值异常
额外优化建议
- 如果你需要处理的站点数量超过50个,可以改用异步请求库
aiohttp并发发起请求,速度可以提升数倍到数十倍 - 可以增加请求重试逻辑,避免偶发网络波动导致的误判
- 非必要的打印操作可以注释,IO操作会拖慢整体运行速度
内容的提问来源于stack exchange,提问作者Douglas Soares
相关产品推荐
相关产品推荐

