You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:51:00