[Python学习笔记]Requests性能优化之Session

Requests 可是说是 Python 中最常用的库了。用法也非常简单,但是想真正的用的好并不容易。

下面介绍一个提升性能小技巧:使用 session 会话功能。
以下是 Requests 官网的介绍:

  • 会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling 功能。所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。

目录

    • 0. 优化效果
    • 1. 优化过程
      • 1.1. 优化前
      • 1.2. 优化后
    • 2. 网络连接数对比
      • 2.1. 优化前
      • 2.2. 优化后
    • 3. session 进阶设置
    • 参考

以下示例脚本采用的是在之前的章节[量化投资-学习笔记013]Python+TDengine从零开始搭建量化分析平台-策略回测进阶中的回测脚本。
程序会查询 9037 张股票的近10个月的交易数据,使用交易策略进行回测,并将回测结构写入数据库。

涉及数据量:
查询 9037 张表,共 1779929 条数据;写入 9037 张表,每个表 1 条数据。

0. 优化效果

优化前后对比程序执行耗时
优化前1m44.5s
优化后30.57s

1. 优化过程

当时为提示写入效率,采用多进程/线程的方式,将回测数据写入数据库。

1.1. 优化前

线程数=1

# time python3 macd_all_code.py
real    1m44.506s
user    0m10.732s
sys     0m1.620s

线程数=2

# time python3 macd_all_code.py 
real    2m45.544s
user    0m20.274s
sys     0m2.338s

时间反而增加了1倍,完全不符合设计逻辑。。

因为数据库部署在本地,磁盘为SSD,CPU负载也不高,因此初步判断问题出在程序内部。
首先排查的就是网络连接部分,因为要查询 9037 张表,每个表发起一次连接(TCP三次握手+四次挥手),这部分确实会耗时较高。
修改代码,使用 session,保证每个线程只建立一次连接。

修改前代码:

def get_request(sql):sql = sql.encode("utf-8")headers = {'Connection': 'keep-alive','Accept-Encoding': 'gzip, deflate, br'}response = requests.post(url, data=sql, auth=(username, password), headers=headers)data = json.loads(response.content.decode())result = data.get("data")return resultdef thread_func(df_code, tnum, list_num):bi = tnum*list_numei = bi+list_numif tnum < (threadNum-1):df = df_code.iloc[bi:ei, :]else:df = df_code.iloc[bi:len(df_code), :]df_profit = loop_bt(df)write_td(df_profit)rss.close()

修改后代码:

def get_request(sql, rss):sql = sql.encode("utf-8")headers = {'Connection': 'keep-alive','Accept-Encoding': 'gzip, deflate, br'}response = rss.post(url, data=sql, auth=(username, password), headers=headers)data = json.loads(response.content.decode())result = data.get("data")return resultdef thread_func(df_code, tnum, list_num):rss = requests.session()bi = tnum*list_numei = bi+list_numif tnum < (threadNum-1):df = df_code.iloc[bi:ei, :]else:df = df_code.iloc[bi:len(df_code), :]df_profit = loop_bt(df, rss)write_td(df_profit, rss)rss.close()
  • 以上只贴了关键两部分代码,其他代码请参考《[量化投资-学习笔记013]Python+TDengine从零开始搭建量化分析平台-策略回测进阶》章节。

1.2. 优化后

threadNum=1

# time python3 macd_all_code_request.py 
real    0m30.566s
user    0m8.497s
sys     0m1.344s

threadNum=2

# time python3 macd_all_code_request.py 
real    0m32.053s
user    0m17.897s
sys     0m1.604s

虽然线程数的提示并没有提示效率,但通过使用 session, 程序整体执行效率提示了 3 倍。

2. 网络连接数对比

以下是测试过程中网络连接数的变化:

2.1. 优化前

未使用session,线程数=1

# ss -s
Total: 181
TCP:   4254 (estab 1, closed 4252, orphaned 0, timewait 4252)Transport Total     IP        IPv6
RAW       0         0         0
UDP       9         5         4
TCP       2         2         0
INET      11        7         4
FRAG      0         0         0

未使用session,线程数=2

# ss -s
Total: 182
TCP:   4203 (estab 0, closed 4200, orphaned 0, timewait 4200)Transport Total     IP        IPv6
RAW       0         0         0
UDP       9         5         4
TCP       3         3         0
INET      12        8         4
FRAG      0         0         0

2.2. 优化后

使用session,线程数=1

# ss -s
Total: 183
TCP:   3 (estab 1, closed 1, orphaned 0, timewait 1)Transport Total     IP        IPv6
RAW       0         0         0
UDP       10        6         4
TCP       2         2         0
INET      12        8         4
FRAG      0         0         0

使用session,线程数=2

# ss -s
Total: 182
TCP:   4 (estab 2, closed 1, orphaned 0, timewait 1)Transport Total     IP        IPv6
RAW       0         0         0
UDP       9         5         4
TCP       3         3         0
INET      12        8         4
FRAG      0         0         0

通过以上对比发现,网络连接数大幅下降,从优化前的 4000 多个 下降到 2-4 个。

3. session 进阶设置

class requests.adapters.HTTPAdapter(pool_connections=10, pool_maxsize=10, max_retries=0, pool_block=False)[source]
The built-in HTTP Adapter for urllib3.Provides a general-case interface for Requests sessions to contact HTTP and HTTPS urls by implementing the Transport Adapter interface. This class will usually be created by the Session class under the covers.Parameters
- pool_connections – The number of urllib3 connection pools to cache.
- pool_maxsize – The maximum number of connections to save in the pool.
- max_retries – The maximum number of retries each connection should attempt. Note, this applies only to failed DNS lookups, socket connections and connection timeouts, never to requests where data has made it to the server. By default, Requests does not retry failed connections. If you need granular control over the conditions under which we retry a request, import urllib3’s Retry class and pass that instead.
- pool_block – Whether the connection pool should block for connections.

我在代码中添加了相关设置

rss.mount('http://', requests.adapters.HTTPAdapter(pool_connections=20, pool_maxsize=20, max_retries=3))

但是执行速度并没有提升,看来瓶颈已经不在网络连接方面了。

后面持续进行优化吧。

参考

官方文档-高级用法-会话对象
python3 requests使用连接池
[Python] 用Session()优化requests的性能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/145755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode之二叉树

发现更多计算机知识&#xff0c;欢迎访问Cr不是铬的个人网站 最近数据结构学到二叉树&#xff0c;就刷了刷力扣&#xff0c;写这篇文章也是辅助记忆。 103二叉树锯齿形遍历 要解出本道题&#xff0c;首先要会层次遍历。层次遍历我们都知道用一个队列去实现就行。但是力扣这里…

FSOD论文阅读 - 基于卷积和注意力机制的小样本目标检测

来源:知网 标题:基于卷积和注意力机制的小样本目标检测 作者:郭永红&#xff0c;牛海涛&#xff0c;史超&#xff0c;郭铖 郭永红&#xff0c;牛海涛&#xff0c;史超&#xff0c;郭铖&#xff0e;基于卷积和注意力机制的小样本目标检测 [J/OL]&#xff0e;兵工学报. https://…

centOs 6.10 编译 qt 5.15.11

安装依赖库 xcb 依赖库 qt xcb 需要的依赖 如何要用 x11, 就要在编译的时候加上 -xcb 选项&#xff0c;就要安装 xcb 相关的库。 到时可以在 config.log 文件查看&#xff0c;缺少哪个库就安装哪个。 下面是我手动安装的库和对应版本&#xff1a; xcb-proto-1.14.tar.gz x…

部署ChatGLW-6B出现的问题

库问题 版本匹配 cuda 11.1 对应的torch 1.10 版本过高导致编译问题&#xff0c;目前已测试一下版本可以 typing_extensions4.8 transformers4.26.1 gradio3.50.0

AH8691-60V降压至3.3V电源芯片:ESOP8封装解决方案

AH8691-60V降压至3.3V电源芯片&#xff1a;ESOP8封装解决方案 随着电子设备的日益普及&#xff0c;电源管理芯片的重要性也日益凸显。一款高效率、低功耗的电源芯片可以大大提高电子设备的性能和可靠性。今天&#xff0c;我们将介绍一款60V降压至3.3V电源芯片&#xff0c;采用…

【React】React-Redux基本使用

容器组件和 UI 组件 所有的 UI 组件都需要有一个容器组件包裹 容器组件来负责和 Redux 打交道&#xff0c;可以随意使用 Redux 的API UI 组件无任何 Redux API 容器组件用于处理逻辑&#xff0c;UI 组件只会负责渲染和交互&#xff0c;不处理逻辑 在我们的生产当中&#xff0…

技术分享 | JMeter性能测试实现与分析

导语 JMeter是由著名开源软件巨头Apache组织开发的纯Java的压力测试工具&#xff0c;它即能测试动态服务&#xff08;WebService&#xff09;&#xff0c;也能测试静态资源&#xff0c;包括Servlet服务、CGI脚本等&#xff0c;还能测试动态语言服务&#xff08;PHP、Java、ASP…

Vue向pdf文件中添加二维码

&#x1f680; 场景一&#xff1a;利用vue向pdf文件中写入二维码图片或其他图片 &#x1f680; 场景二&#xff1a;向pdf中添加水印 思路&#xff1a; 1、先通过url链接生成二维码&#xff0c;二维码存在于dom中 2、使用html2canvas库将二维码的dom转为一个canvas对象 3、根据c…

V100 配置 Scanpy + Scvi + Pytorch

V100配置 Scanpy Scvi Pytorch 创建虚拟环境安装基础包安装 Scanpy安装 Scvi安装 GPU 版本 Pytorch 创建虚拟环境 conda create -n name python3.8 conda activate name安装基础包 conda install numpy安装 Scanpy conda install scanpy安装 Scvi conda install scvi-too…

画图时使用的函数和一些错误处理

1. 关于 画图时后的数据量匹配错误&#xff08;应该是&#xff09; 然后这块还有个问题&#xff1a; import pynvml import matplotlib.pyplot as plt import matplotlib.animation as animationdef get_gpu_memory_usage(handle):gpu_mem pynvml.nvmlDeviceGetMemoryInfo(h…

网络营销|如何利用line拓展东南亚市场

Line在亚洲地区非常流行&#xff0c;特别是在日本、台湾、泰国等地&#xff0c;是当地最受欢迎的即时通讯应用之一。 除了基本的聊天功能外&#xff0c;Line还提供了各种各样的贴图、表情包和游戏等娱乐功能&#xff0c;吸引了大量的用户。 一、选择利用line进行海外营销的原…

浅谈OAuth 2.0与JWT

OAuth 2.0 OAuth 2.0是一个关于授权的开放网络标准&#xff0c;允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息&#xff0c;而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。其最终目的是颁发一个有时效性的令牌&#xff08;access_token&a…

debian/ubuntu/linux如何快速安装vscode

前言 这里写一篇简短的文字用来记录如何在Linux发行版上快速安装VScode&#xff0c;主要使用的一个软件snap&#xff0c;做一个简单介绍&#xff1a; Snap Store 是 Ubuntu、Debian、Fedora 和其他几个 Linux 发行版中的一个应用商店&#xff0c;提供了数千个应用程序和工具的…

.net core中前端vue HTML5 History 刷新页面404问题

放到启动的应用程序的最后面 app.Run(async (context) > {context.Response.ContentType "text/html";await context.Response.SendFileAsync(Path.Combine(env.WebRootPath, "index.html")); });https://blog.csdn.net/lee576/article/details/88355…

Nas搭建webdav服务器并同步Zotero科研文献

无需云盘&#xff0c;不限流量实现Zotero跨平台同步&#xff1a;内网穿透私有WebDAV服务器 文章目录 无需云盘&#xff0c;不限流量实现Zotero跨平台同步&#xff1a;内网穿透私有WebDAV服务器一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zote…

OpenAI chatGPT又又又出bug!强制开通plus

自奥特曼宣布暂时停止plus用户的注册后&#xff0c;plus账号的价格水涨船高&#xff01; 现在教大家如何强制开通plus&#xff0c;体验gpt4等各种功能&#xff01; 如图&#xff1a; 打开官网进入后&#xff0c;按F12打开控制台&#xff0c;在控制台上输入代码 即可强制跳转至付…

SpringBoot如何自定义注解

SpringBoot如何自定义注解 ​ 在Java中&#xff0c;我们可以创建自定义注解&#xff0c;这是一种应用于类、方法、变量、参数和包等元素的元数据。自定义注解可以帮助我们更好地组织和处理代码。需要注意的是&#xff0c;自定义注解本身不会改变代码的行为。它们只是一种元数据…

使用Ant Design Pro开发时的一个快速开发接口请求的技巧

使用Ant Design Pro开发时的一个快速开发接口的技巧 当我们的后端在写好接口以后&#xff0c;我们通过swagger knife4j可以生成一个接口文档&#xff0c;后端启动以后&#xff0c;可以生成一个接口文档&#xff0c;当输入地址 localhost:8101/api/v3/api-docs &#xff08;这…

官宣!Wayland正式支持基于IntelliJ的IDE

对于基于IntelliJ IDE的Linux用户来说&#xff0c;一项令人期待的进步即将到来 – 对 Wayland 显示服务器协议的支持。 这项更新将带来许多好处&#xff0c;包括解决古老的分数缩放问题以及在与适用于 Linux 的 Windows 子系统 (WSLg)&#xff08;在底层运行 Wayland 服务器&am…

高德地图系列(一):vue项目如何使用高德地图、入门以及基本控件使用

目录 第一章 前言 第二章 准备工作 2.1 账号注册 2.2 高德地图开发平台文档 2.3 创建应用 第三章 使用地图 3.1 地图使用步骤 3.2 理解几个地图基础控件 3.3 基础类理解 第一章 前言 小编都是在vue项目中使用高德地图的&#xff0c;每一个功能都会亲测可用之后才会…