【Python-利用动态二维码传输文件(七)】计算文件传输速度,以KB/s形式显示在Tkinter界面。

2023-10-31

        上一篇文章实现了动态二维码文件接收端的基本功能,但只能显示接收数据的完成度,不能显示接收速度,本篇文章研究怎么计算文件传输速度,并以KB/s形式显示在Tkinter界面,方便以后调试和优化代码。

 

一、程序效果展示

        可以看到右下角有统计发送速度的状态栏,传输速度约为1.3kb/s,还是挺慢的,还需要继续优化代码提高效率。


 二、程序设计原理

        (一)搞清楚文件大小的统计单位

        编程前应先弄明白Byte、KB、MB、GB之间的关系,有兴趣可以看看这篇文章的一些基本概念,辅助设计合理可靠的算法。

        文件大小的统计单位参考文章↓↓↓
位(bit)、字节(Byte)、KB、MB、GB、TB之间的换算关系_爱学习的哆啦A梦的博客-CSDN博客_bit byte换算bit(位,又名“比特”):bit的缩写是b,是计算机运算的基础,属于二进制的范畴。通常用bit来作数据传输的单位,因为物理层,数据链路层的传输对于用户是透明的,而这种通信传输是基于二进制的传输。Byte(字节):Byte的缩写是B,是计算机文件大小的基本计算单位。在应用层通常是用Byte来作单位,表示文件的大小,在用户看来就是可见的数据大小。比如一个字符就是1Byte,如果是汉字,则是2By...https://blog.csdn.net/weixin_44232308/article/details/87062271?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%AD%97%E8%8A%82%E8%BD%AC%E6%8D%A2kb%E3%80%81mb%E3%80%81gb%E3%80%81tb&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-87062271.nonecase&spm=1018.2226.3001.4187

        这里引用这篇文章的图简单说明它们之间的关系,由于动态二维码发送文件的速度很慢,目前自己写的程序速度大概为:小文件能到2~3KB/每秒,大文件只能到1~1.5KB/每秒。因此到KB就够用了,还没到MB级别,只需重点实现bit、ByteKB之间的转换即可。

  


        (二)搞清楚不同单位的转换,并使用Pythonsys.getsizeof()函数计算对象内存大小 

        getsizeof()只计算实际使用的内存大小,引用所消耗的内存大小不计算。经过上图计算可以得到以下转换公式。

        1Byte(字节)=8b(位)
        1 KB = 1024 B
        1 MB = 1024 KB

        sys.getsizeof()返回的是Byte的数量。因此使用sys.getsizeof(_str)/1024,可以得到KB的数量。

        以下代码实现循环截图,并统计累计接收数据的大小。其中_qr_set_size = _qr_set_size + sys.getsizeof(_str) / 1024实现累加统计数据量的大小。为什么不直接使用sys.getsizeof(_qr_set)统计set对象的大小呢,因为经过测试,当set对象内存不足的时候会自动提前扩大set内存,而且不是按实际大小扩容,所以统计set对象的内容并不能得到累加数据量的大小

# 当_stop_flag为False,一直循环截图
_stop_flag[0] = False
# 统计接收速度,_qr_set_size为目前接收数据量的大小
_qr_set_size = 0
# _qr_set用于存放每帧识别出来的二维码信息,set数据结构用于存放不重复数据,对存入的数据会自动去重
_qr_set = set()
# 使用pyautogui.screenshot()对屏幕截图
while _stop_flag[0] is False:
    _screenshot_img = pyautogui.screenshot()
    # 把Pillow图片对象转换为numpy图片对象
    _numpy_img = numpy.array(_screenshot_img)
    # 将图像灰度化提高识别效率
    _cvt_image = cv2.cvtColor(_numpy_img, cv2.COLOR_BGR2GRAY)
    # 解析二维码中的数据
    _qr_data = pyzbar.decode(_cvt_image)
    # 判断二维码是否识别成功,若识别成功,识别数据的长度_data_len应大于0
    if _data_len > 0:
        # 把识别出来的单张二维码图片信息存入_qr_set中
        _str = _qr_data[0].data.decode('utf-8')
        _qr_set.add(_str)
        # 统计累计接收数据大小
        _qr_set_size = _qr_set_size + sys.getsizeof(_str) / 1024

 sys.getsizeof()的参考文章↓↓↓

python-sys.getsizeof的使用_我是乔木的博客-CSDN博客_sys.getsizeof科班出身的码畜一直被灌输一条上帝圣经:“一个int占4个字节,一个char占1个字节,一个float占4个字节。。。”,今天看下了python的getsizeof函数,发现python中各个基本数据类型(对象)占用的内存大小和c++/Java完全不一样~前提概述:python中一切都是对象,so python中其实根本不存在int float这些类型,int其实是一个python对象...https://blog.csdn.net/qm5132/article/details/100557950


(三)计算每次累加数据的时间间隔,使用公式得出传输速度

        设当前累计接收的文件大小为_qr_set_size,用q代表

        设每次向set对象添加数据的时间间隔为_time_span,用t代表

        设文件传输的速度为_label_speed_text,用s代表

        那计算文件传输的公式为:s= \frac{q}{t},Python代码如下:

# 接收开始时间
_start_time = time.time()
#某操作
#某操作
#某操作

# 获取当前时间time.time(),减去开始时间_start_time,使用round保留两位小数
_time_span = round(time.time() - _start_time, 2)

# 设置Tkinter Label
_label_speed_text.set("%.2fkb/s" % (_qr_set_size / _time_span))

 三、完整源代码

# 使用OpenCV库连续截图,并逐张识别出二维码信息
def save_qrs(_tk, _progressbar, _label_progress_text, _stop_flag, _label_filepath_text, _label_speed_text):
    # _qr_set用于存放每帧识别出来的二维码信息,set数据结构用于存放不重复数据,对存入的数据会自动去重
    _qr_set = set()
    # 设置进度条默认长度为100
    _pb_len = 100
    # 统计接收速度,_qr_set_size为目前接收数据量的大小
    _qr_set_size = 0
    # 当_stop_flag为False,一直循环截图
    i = 0
    _stop_flag[0] = False
    # 接收开始时间
    _start_time = time.time()
    while _stop_flag[0] is False:
        # 使用pyautogui.screenshot()对屏幕截图
        _screenshot_img = pyautogui.screenshot()
        # 把Pillow图片对象转换为numpy图片对象
        _numpy_img = numpy.array(_screenshot_img)
        # 将图像灰度化提高识别效率
        _cvt_image = cv2.cvtColor(_numpy_img, cv2.COLOR_BGR2GRAY)
        # 解析二维码中的数据
        _qr_data = pyzbar.decode(_cvt_image)
        # 统计接收进度,_qr_set_len为目前接收的不重复的二维码信息数
        _qr_set_len = len(_qr_set)
        # _data_len为单张二维码图片识别后数据的长度用于判断二维码是否识别成功,识别不成功长度为0
        _data_len = len(_qr_data)
        # 更新界面状态栏状态,如:正在接收,[11/51]
        _label_progress_text.set("正在接收,[%d/%d]" % (_qr_set_len, _pb_len))
        # 判断二维码是否识别成功,若识别成功,识别数据的长度_data_len应大于0
        if _data_len > 0:
            _str = _qr_data[0].data.decode('utf-8')
            # 把识别出来的单张二维码图片信息存入_qr_set中
            _qr_set.add(_str)
            _qr_set_len_now = len(_qr_set)
            if _qr_set_len_now != _qr_set_len:
                _qr_set_size = _qr_set_size + sys.getsizeof(_str) / 1024
            _time_span = round(time.time() - _start_time, 2)
            _label_speed_text.set("%.2fkb/s" % (_qr_set_size / _time_span))
            if _qr_set_len == 0:
                # 用于更新进度条长度_pb_len,只在接收第一次数据时更新长度提高效率
                # 接收数据的格式如:[1/51]xsdgsiakghalshg,获取51存入_pd_len
                _str1 = _str.split(']')
                _str2 = _str1[0].split('/')
                _pb_len = int(_str2[1])
                _progressbar["maximum"] = _pb_len
            # 更新进度条进度
            _progressbar["value"] = _qr_set_len
        if _qr_set_len == _pb_len:
            # 全部数据接收完毕跳出循环
            break
        _tk.update()
    i = i + 1

    if _stop_flag[0] is False:
        # 调用合并函数
        regroup(_qr_set, _label_filepath_text)
        _label_progress_text.set("已完成接收")
    else:
        _label_progress_text.set("已暂停")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python-利用动态二维码传输文件(七)】计算文件传输速度,以KB/s形式显示在Tkinter界面。 的相关文章

随机推荐

  • postman循坏调用接口

    postman循坏调用接口 新建一个Collections 在新建的Collections里面新建需要循环的接口 将需要循坏变化的参数设置成变量 设置好变量之后 运行整个collections 变量值的数量应该与迭代次数一致 可以导入jso
  • YOLOv5+单目测距(python)

    YOLOv5 单目测距 python 1 相关配置 2 测距原理 3 相机标定 3 1 标定方法1 3 2 标定方法2 4 相机测距 4 1 测距添加 4 2 细节修改 可忽略 4 3 主代码 5 实验效果 相关链接 1 YOLOV7 单目
  • python ttk Treeview的插入、清空、各种点击事件、获取条目值、标题单击排序

    昨天整了一天Tkinter的treeview 发现中文的教程乃至提问都很少 其中两个问题的解决都是靠steakoverflow上找到的 在这里放出来我遇到并解决的问题 大家以后可能遇到的话就能省点事了 插入方法 import tkinter
  • 第二章-Kali安装

    目录 2 Kali Linux安装 硬盘安装 虚拟机安装 01硬盘安装 02DOCKER 03虚拟机安装 3 Kali Linux 安装 持久加密USB安装 熟悉环境 熟悉BASH命令 01 持久加密USB安装 1 02 持久加密USB安装
  • 专注于开源技术的研究与应用由Tencent://Message协议想到的一个解决方案

    源代码下载 http files cnblogs com phinecos HelloWorldProtocal rar 前天在BruceZhang 的一篇博文 求助 如何在ASP页面中调用Winform程序呢 中回答了他提出的问题 但细想
  • jsp调用证书类ocx控件问题

    1 先注册ocx 本次使用的方式是先将我调用的两个控件打包成 CAB文件 然后做成一个exe让用户去下载注册 2 jsp页面上使用 进行调用 ps clsid可以在注册表中找到 id是自己定义的 因为控件在第一步已经注册到注册表里 code
  • 重学Elasticsearch7(来源官方文档)

    一 开篇总览 1 bulk操作最好请求体数据大小在5m 15m 2 由于要给文件系统缓存留下足够空间 es的jvm堆大小不要超过服务器可用内存空间的一半 二 聚合 1 在聚合时 missing字段可以给没有该字段的文档以默认值 2 带权重的
  • html登录页面整理

    img src data image png base64 iVBORw0KGgoAAAANSUhEUgAAAycAAAJGCAYAAABBdvriAAAgAElEQVR4Aey9W5okN5KsWUz2qmaxs7zzNEvoSo78Ii
  • java自动化测试语言高级之Java 9 新特性

    java自动化测试语言高级之Java 9 新特性 文章目录 java自动化测试语言高级之Java 9 新特性 Java 9 新特性 Java 9 新特性 Java 9 发布于 2017 年 9 月 22 日 带来了很多新特性 其中最主要的变
  • 内嵌模式搭建Hive

    在此之前已经搭建好了一个三台机器的hadoop集群 https blog csdn net QYHuiiQ article details 123055389 spm 1001 2014 3001 5501 接下来在此基础上搭建hive 下
  • (C++)GDAL学习笔记——1 均值滤波和中值滤波

    就要开始研究生生活了 这个暑假要学一下GDAL相关的知识 这里将中间完成的一些东西Mark下来 方便自己以后回顾 任务 利用Vc 编写一个3 3的均值滤波或中值滤波程序 代码 注 此次试验用到的影像为波段数为1的tif格式影像 主函数 in
  • 2022 年 MathorCup 高校数学建模挑战赛——大数据竞赛赛道 赛道 B:北京移动用户体验影响因素研究

    问题 1 根据附件 1 和附件 2 分别研究影响客户语音业务和上网业务 满意度的主要因素 并给出各因素对客户打分影响程度的量化分析和结果 附件 1 2 中各字段的解释说明见附件 5 问题一本质就是特征筛选问题 而且要给出各特征影响程度的量化
  • node实现发送邮件和上传文件功能

    文章目录 node实现发送邮件带附件 node 是什么 下载 文件结构 index html文件 nodemails js文件 node实现发送邮件带附件 记录下我前不久刚刚接触过的node用来实现发送邮件和上传文件图片功能 希望能帮到和我
  • L2-021 点赞狂魔分数

    微博上有个 点赞 功能 你可以为你喜欢的博文点个赞表示支持 每篇博文都有一些刻画其特性的标签 而你点赞的博文的类型 也间接刻画了你的特性 然而有这么一种人 他们会通过给自己看到的一切内容点赞来狂刷存在感 这种人就被称为 点赞狂魔 他们点赞的
  • vector扩容

    扩容原理 vector以连续的数组存放数据 当vector空间已满时会申请新的空间并将原容器中的内容拷贝到新空间中 并销毁原容器 存储空间的重新分配会导致迭代器失效 因为分配空间后需要进行拷贝 编译器会预分配更多空间以减少发生拷贝影响程序效
  • 音视频绕不开的话题之WebRTC

    什么是WebRTC 闲来无事 我们今天探讨下音视频绕不开的一个话题 WebRTC WebRTC之于音视频行业 无异于FFMpeg 可以说WebRTC的开源 让音视频行业大跨步进入发展快车道 WebRTC是一个支持实时音视频通信的开源项目 它
  • Vue3项目开发使用技巧setup

  • 【第18例】IPD进阶:跨部门团队 —— SPDT超级产品开发团队

    目录 简介 专栏目录 详细内容 相关专栏推荐 CSDN学院 作者简介 简介 今天 IPD体系进阶100例 就更新到了第 18 例 SPDT 是英文 Super Product Development Team 的英文首字母简称
  • java网络编程:9、基于TCP的socket编程(二)服务器端循环监听接收多个客户端_多线程服务器程序

    声明 本教程不收取任何费用 欢迎转载 尊重作者劳动成果 不得用于商业用途 侵权必究 文章目录 一 核心代码编写 1 服务器端程序的编写 2 客户端程序的编写 3 测试打印输出 二 系列文章 java网络编程 上篇讲了基于tcp的编程的一些基
  • 【Python-利用动态二维码传输文件(七)】计算文件传输速度,以KB/s形式显示在Tkinter界面。

    上一篇文章实现了动态二维码文件接收端的基本功能 但只能显示接收数据的完成度 不能显示接收速度 本篇文章研究怎么计算文件传输速度 并以KB s形式显示在Tkinter界面 方便以后调试和优化代码 一 程序效果展示 可以看到右下角有统计发送速度