Python 3 urllib 与请求性能

2024-04-29

我正在使用 python 3.5,并且正在检查 urllib 模块与 requests 模块的性能。 我用 python 编写了两个客户端,第一个使用 urllib 模块,第二个使用 request 模块。 它们都生成二进制数据,我将其发送到基于 Flask 的服务器,并且我还从 Flask 服务器将二进制数据返回给客户端。 我发现两个模块(urllib、requests)将数据从客户端发送到服务器所花费的时间相同,但是与请求相比,urllib 将数据从服务器返回到客户端所花费的时间要快两倍以上。 我正在本地主机上工作。
我的问题是为什么?
我对请求模块做错了什么,导致速度变慢?

这是服务器代码:

from flask import Flask, request
app = Flask(__name__)
from timeit import default_timer as timer
import os

@app.route('/onStringSend', methods=['GET', 'POST'])
def onStringSend():
    return data

if __name__ == '__main__':
    data_size = int(1e7)
    data = os.urandom(data_size)    
    app.run(host="0.0.0.0", port=8080)

这是基于 urllib 的客户端代码:

import urllib.request as urllib2
import urllib.parse
from timeit import default_timer as timer
import os

data_size = int(1e7)
num_of_runs = 20
url = 'http://127.0.0.1:8080/onStringSend'

def send_binary_data():
    data = os.urandom(data_size)
    headers = {'User-Agent': 'Mozilla/5.0 (compatible; Chrome/22.0.1229.94;  Windows NT)', 'Content-Length': '%d' % len(data), 'Content-Type':  'application/octet-stream'}
    req = urllib2.Request(url, data, headers)
    round_trip_time_msec = [0] * num_of_runs
    for i in range(0,num_of_runs):
        t1 = timer()
        resp = urllib.request.urlopen(req)
        response_data = resp.read()
        t2 = timer()
        round_trip_time_msec[i] = (t2 - t1) * 1000

    t_max = max(round_trip_time_msec)
    t_min = min(round_trip_time_msec)
    t_average = sum(round_trip_time_msec)/len(round_trip_time_msec)

    print('max round trip time [msec]: ', t_max)
    print('min round trip time [msec]: ', t_min)
    print('average round trip time [msec]: ', t_average)


send_binary_data()

这是基于请求的客户端代码:

import requests
import os
from timeit import default_timer as timer


url = 'http://127.0.0.1:8080/onStringSend'
data_size = int(1e7)
num_of_runs = 20


def send_binary_data():
    data = os.urandom(data_size)
    s = requests.Session()
    s.headers['User-Agent'] = 'Mozilla/5.0 (compatible; Chrome/22.0.1229.94;Windows NT)'
    s.headers['Content-Type'] = 'application/octet-stream'
    s.headers['Content-Length'] = '%d' % len(data)

    round_trip_time_msec = [0] * num_of_runs
    for i in range(0,num_of_runs):
        t1 = timer()
        response_data = s.post(url=url, data=data, stream=False, verify=False)
        t2 = timer()
        round_trip_time_msec[i] = (t2 - t1) * 1000

    t_max = max(round_trip_time_msec)
    t_min = min(round_trip_time_msec)
    t_average = sum(round_trip_time_msec)/len(round_trip_time_msec)

    print('max round trip time [msec]: ', t_max)
    print('min round trip time [msec]: ', t_min)
    print('average round trip time [msec]: ', t_average)

send_binary_data()

非常感谢


首先,要重现该问题,我必须将以下行添加到您的onStringSend功能:

request.get_data()

否则,我会收到“连接由对等方重置”错误,因为服务器的接收缓冲区不断填满。

现在,这个问题的直接原因是Response.content(当stream=False) 以 10240 字节为单位迭代响应数据 https://github.com/kennethreitz/requests/blob/87704105af65b382b86f168f6a54192eab91faf2/requests/models.py#L741:

self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes()

因此,解决该问题最简单的方法是使用stream=True,从而告诉 Requests 您将按照自己的节奏读取数据:

response_data = s.post(url=url, data=data, stream=True, verify=False).raw.read()

通过此更改,Requests 版本的性能与 urllib 版本的性能大致相同。

另请参阅“原始响应内容 http://requests.readthedocs.io/en/master/user/quickstart/#raw-response-content” 请求文档中的部分以获取有用的建议。

现在,有趣的问题仍然存在:为什么Response.content迭代这么小的块?后Requests的核心开发者,看起来可能没有什么特别的原因。我提交了问题#3186 https://github.com/kennethreitz/requests/issues/3186在请求进一步调查这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 3 urllib 与请求性能 的相关文章

  • 为什么 pandas 在简单的数学运算上比 numpy 更快?

    最近 我观察到 pandas 的乘法速度更快 我在下面的例子中向您展示了这一点 如此简单的操作怎么可能做到这一点 这怎么可能呢 pandas 数据帧中的底层数据容器是 numpy 数组 测量 我使用形状为 10k 10k 的数组 数据框 i
  • Python Numpy Reshape错误[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试重塑 3D numpy 数组时遇到一个奇怪的错误 数组 x 的形状为 6 10 300 我想将其重塑为 6 3000 我正
  • 在推送到容器注册表之前如何对构建的映像运行测试?

    从 gitlab 文档中可以看出如何使用 kaniko 创建 docker 镜像 build stage build image name gcr io kaniko project executor debug entrypoint sc
  • 时间复杂度和运行时间有什么区别?

    时间复杂度和运行时间有什么区别 它们是一样的吗 运行时间是指程序运行所需的时间 时间复杂度是对输入大小趋于无穷大时运行时间渐进行为的描述 您可以说运行时间 是 O n 2 或其他什么 因为这是描述复杂性类和大 O 表示法的惯用方式 事实上
  • sy.sympify(str(表达式)) 不等于表达式

    据我了解 str将 SymPy 表达式转换为字符串并sympify将字符串转换为 SymPy 表达式 因此 我希望以下内容成立 对于合理的表达 gt gt gt sy sympify str expr expr True 我尝试过这个 确实
  • Python函数组成

    我尝试使用良好的语法来实现函数组合 这就是我所得到的 from functools import partial class compfunc partial def lshift self y f lambda args kwargs s
  • 如何将脚本作为 pytest 测试运行

    假设我有一个用简单脚本表示的测试assert 陈述 请参阅背景了解原因 例如 import foo assert foo 3 4 我如何以一种好的方式将该脚本包含在我的 pytest 测试套件中 我尝试了两种有效但不太好的方法 一种方法是将
  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • 烧瓶 - 404 未找到

    我是烧瓶开发的新手 这是我在烧瓶中的第一个程序 但它向我显示了这个错误 在服务器上找不到请求的 URL 如果您输入了网址 请手动检查拼写并重试 这是我的代码 from flask import Flask app Flask name ap
  • 如果另一列中的值为空,则删除重复项 - Pandas

    我拥有的 df Name Vehicle Dave Car Mark Bike Steve Car Dave Steve 我想从 名称 列中删除重复项 但前提是 车辆 列中的相应值为空 我知道我可以使用 df dropduplicates
  • 无法在我的程序中使用 matplotlib 函数

    我正在 Windows 10 中运行 Anaconda 安装 conda 版本 4 3 8 这是我尝试在 python 命令行中运行的代码 import matplotlib pyplot as plt x 1 2 3 4 y 5 6 7
  • C# 中单个 & 符号的第二个含义是什么?

    我在 C 中使用了单个与号 来表示 检查second条件语句即使第一个是false 但以下似乎是不同的意思 of 总而言之 谁能解释一下如何i 1在下面的例子中有效吗 List
  • 如何仅注释堆积条形图的一个类别

    我有一个数据框示例 如下所示 data Date 2021 07 18 2021 07 19 2021 07 20 2021 07 21 2021 07 22 2021 07 23 Invalid NaN 1 1 NaN NaN NaN N
  • Django 1.7 应用程序配置导入错误:没有名为 appname.apps 的模块

    我正在尝试按照以下文档为我的一个名为 文章 的 Django 应用程序设置自定义应用程序配置https docs djangoproject com en dev ref applications https docs djangoproj
  • 导入目录下的所有模块

    有没有办法导入当前目录中的所有模块 并返回它们的列表 例如 对于包含以下内容的目录 mod py mod2 py mod3 py 它会给你
  • 如何处理 Tkinter 中的窗口关闭事件?

    如何在 Python Tkinter 程序中处理窗口关闭事件 用户单击 X 按钮 Tkinter 支持一种称为协议处理程序 http web archive org web 20201111215134 http effbot org tk
  • 操作错误:尝试在 ubuntu 服务器中写入只读数据库

    我正在使用 FlaskApp 运行mod wsgi and apache2在 Ubuntu 服务器上 我尝试运行烧瓶应用程序localhost成功 然后部署到ubuntu服务器上 但是当我尝试更新数据库时 出现错误 Failed to up
  • 如何在supervisord中设置组?

    因此 我正在设置 Supervisord 并尝试控制多个进程 并且一切正常 现在我想设置一个组 以便我可以启动 停止不同的进程集 而不是全部或全无 这是我的配置文件的片段 group tapjoy programs tapjoy game1
  • 在 python 中使用高精度时间戳

    嘿 我正在使用 python 处理日期时间 我想知道解析这个时间戳的最佳方法是什么 时间戳是ISO标准 这里是一个例子 2010 06 19T08 17 14 078685237Z 现在到目前为止我已经使用过 time datetime d
  • 用 Beautiful Soup 进行抓取:为什么 get_text 方法不返回该元素的文本?

    最近我一直在用 python 开发一个项目 其中涉及抓取一些网站的一些代理 我遇到的问题是 当我尝试抓取某个知名代理站点时 当我要求 Beautiful Soup 查找 IP 在代理表中的位置时 它并没有按照我的预期执行操作 我将尝试查找每

随机推荐

  • 在 Rust 中,我用什么来与多个线程和一个 writer 共享一个对象?

    当对象有时可能由一个所有者写入时 在多个线程之间共享公共对象的正确方法是什么 我尝试创建一个ConfigurationTrait 对象具有多种获取和设置配置键的方法 我想将其传递给可以读取配置项的其他线程 如果每个人都能写和读 那就加分了
  • 与黄金链接器链接的二进制文件运行速度更快吗?

    使用 GEANT4 大型 Monte Carlo C 模拟框架 大量共享库 运行模拟代码 使用黄金链接器和基于标准 BFD 的链接器编译并链接 GEANT 和我的应用程序 看起来黄金跑得更快一点 1 47 vs 1 51 有人可以阐明造成差
  • Xcode9:修复范围内的所有内容始终处于禁用状态

    Xcode9 编辑器 修复范围内的所有内容始终处于禁用状态 我怎样才能启用它 在新的 Xcode 版本 9 2 9C40b 中进行了更新 效果非常好
  • 让 `npm install --save` 添加严格版本到 package.json

    当你跑步时npm install save somepackage 它通常会在 package json 中添加这样的内容 dependencies somepackage 2 1 0 因为版本前面带有插入符号 这意味着如果您稍后运行npm
  • 如何在knockout视图模型点击事件中访问$parent或$parents[]?

    我遇到了一种情况 我想通知祖父母或 parents 1 子视图模型中发生的点击事件 所以基本上我希望能够做到这一点 self parents 1 actionTaken 我认为这不起作用 因为绑定上下文与 viewModel 但我想听听是否
  • 是否可以对更高种类类型的类实例强制执行类型约束?

    我有一个这样定义的类型 newtype PrimeSet a P Integer deriving Eq 我还定义了一个将素数集转换为列表的函数 假设它的类型参数是Integral toList Integral a gt PrimeSet
  • JAXB 和 complexType 与其元素之一共享名称会生成不正确的代码

    我有这个 xsd 它有点糟糕 但我必须使用它来避免更改我正在编写的 servlet 的接口 请求 响应接口的 xsd 包含以下行
  • C 预处理器字符串化怪异

    我正在定义一个宏 该宏的计算结果为常量字符串 保存文件名和行号 用于记录目的 它工作正常 但我只是不明白为什么需要 2 个额外的宏 STRINGIFY and TOSTRING 当直觉简单地表明 FILE LINE include
  • 在 iOS 上的 PhoneGap 或 Cleaver (Cordova) 中加载远程 html

    我在我的本机 iOS 6 应用程序中使用 Cordova 2 4 组件 Cleaver 和嵌入式视图 到目前为止 我已经成功创建了项目结构 链接了 Cordova 库并设置了 Hello World 应用程序 该应用程序确实可以提供 设备就
  • 使用awk对字段进行排序和排列

    我现在正在尝试学习 awk 我想做一项特定的任务 我的问题与之前发布的问题范围相似 使用 awk 将列转置为行 https stackoverflow com questions 13634816 using awk to transpos
  • 如何将多个 .txt 文件读入 R? [复制]

    这个问题在这里已经有答案了 我正在使用 R 来可视化一些数据 所有这些数据都是 txt 格式 一个目录中有几百个文件 我想一次性将其全部加载到一个表中 有什么帮助吗 EDIT 列出文件不是问题 但我在从列表到内容的过程中遇到了困难 我已经尝
  • 我可以在 MySQL 中存储图像吗?

    这个问题在这里已经有答案了 可能的重复 MySQL 中的图像 https stackoverflow com questions 1665730 images in mysql 在 MySQL 中存储图像 https stackoverfl
  • 通过php在csv单元格中创建回车符

    我正在尝试动态生成一个 csv 文件 其中包含一些包含多行的单元格 例如 地址字段需要分组为单个 地址 单元格 而不是地址 城市 州等 一切进展顺利 但在过去的两天里 我尝试在代码中插入 r r n n chr 10 chr 13 以及回车
  • C# IAttachmentExecute

    我正在尝试使用I附件执行 http msdn microsoft com en us library bb776297 28VS 85 29 aspx我的 C 应用程序中的接口 使用 NET4和VS2010 MSDN 说它在Shdocvw
  • 如何在 VSCode 的 zen 模式下启用行号?

    有没有办法在 VSCode 的 zen 模式下启用行号 In your settings json插入行 zenMode hideLineNumbers false
  • SQL Server 存储过程中的可选参数

    我正在写一些存储过程 https en wikipedia org wiki Stored procedure在 SQL Server 2008 中 这里可能存在可选输入参数的概念吗 我想我总是可以传入 NULL 作为我不想使用的参数 检查
  • C#:保留类中构造函数的引用参数

    基本上我希望能够引用类实例内的变量 但我希望引用成为类变量 因此我不需要将其作为参数在类内部发送 code int num 0 myClass num print num output is 0 but i d like it to be
  • Bootstrap 轮播下一个和上一个功能不起作用

    使用最新版本并具有基本的轮播 我已经让它可以使用所有默认设置 但是当尝试添加或停止某些功能时 事情会中断或根本不起作用 我希望能够手动循环浏览图像 不希望它自动循环 我只想使用下一个和上一个按钮来循环 我在这里读过一些帖子 但解决方案不起作
  • 将闪亮应用程序部署到 Shinyapps.io 时出错

    我有一个闪亮的应用程序 它在server R file library shiny Creating the app library ggplot2 library plyr library reshape2 library scales
  • Python 3 urllib 与请求性能

    我正在使用 python 3 5 并且正在检查 urllib 模块与 requests 模块的性能 我用 python 编写了两个客户端 第一个使用 urllib 模块 第二个使用 request 模块 它们都生成二进制数据 我将其发送到基