Python学习之十九_程序运行时间的验证

python,学习,十九,程序运行,时间,验证 · 浏览次数 : 7

小编点评

**程序运行时间的验证背景** 最近一段时间,Python学习之十九课程频繁出现一些性能瓶颈问题,包括: * **lua脚本优化redis访问** * **python连接redis验证效率问题** 为了解决这些问题,我决定借用lua脚本优化redis访问场景,学习一下python连接redis,以及验证lua脚本和原生redis命令的效率问题。 **连接redis的方法** 使用python的redis模块连接redis。以下是一些常用的方法: 1. **依次设置五个键值对的值** ```python import redis # 创建Redis客户端对象 client = redis.Redis() # 设置五个键值对的值 for i in range(5): client.set('foo%d' % i, 'bar') ``` 2. **定义一个lua脚本** ```python import redis # 创建Redis客户端对象 client = redis.Redis() # 定义lua脚本 script = "\"\for i=1,#KEYS do redis.call('SET', KEYS[i], ARGV[i]) end\"\"\"" # 注册lua脚本 client.register_script(script) ``` **验证lua脚本和原生redis命令效率问题** 使用timeit模块测试脚本和原生redis命令的执行时间。以下是测试结果: | 方法 | 时间 (毫秒) | |---|---| | 依次设置 | 9.80 | | 脚本 | 0.99 | | 原生 | 1 | **结论** lua脚本是一种极大的减少网络交互和上下文切换时间的工具。在某些情况下,使用lua脚本可以将原生的redis命令的执行时间从几毫秒减少到几毫秒。 **建议** 1. 使用lua脚本优化redis访问。 2. 探索使用lua脚本代替原生的redis命令的可能性。 3. 持续学习和实践,提升您的Python编程技能。

正文

Python学习之十九_程序运行时间的验证


背景

最近一段时间比较忙.
而且还遇到了一个lua脚本优化redis访问的场景. 
想着自己还在学习python(时断时续)
所以想借着这个场景,学习一下python连接redis,以及验证lua脚本和原生redis命令的效率问题.

虽然方式比较原始, 但是希望能够慢慢的提升自己的水平. 

思路

使用python的redis模块连接redis.
第一种方式是依次set 五个键值对的值. 
然后循环1000次 

第二种定义一个lua脚本. 一次性给五个键值对赋值

然后使用timeit的方式验证程序运行时间. 
注意这边按照网上的资料使用了挺多方式,感觉timeit的时间应该是最准确的

原始命令的方式

import redis
import timeit
r = redis.Redis(host='10.110.80.116', port=36379, password='Test20131127',db=0)
def func() :
    for i in range(1000) :
        r.set('foo1', 'bar')
        r.set('foo2', 'bar')
        r.set('foo3', 'bar')
        r.set('foo4', 'bar')
        r.set('foo5', 'bar')

for i in range(2) :
    print(timeit.timeit(stmt=func, number=1))
r.close()

多次运行的时间分别为:
9.8031517
6.0200762
5.4299611
4.7607075
4.8155348

排除掉第一次最慢的时间,预计时间应该是 5s 左右. 
因为实际上执行了 5000次 redis的set命令, 实际上每次命令的耗时是1ms左右.

Redis lua脚本验证

import redis
import timeit

r = redis.Redis(host='10.110.80.116', port=36379, password='Test20131127',db=0)

keys = ['key1', 'key2', 'key3', 'key4', 'key5']
values = ['value1', 'value2', 'value3', 'value4', 'value51241234']

script = """
for i=1,#KEYS do redis.call('SET', KEYS[i], ARGV[i]) end
"""

compiled_script = r.register_script(script)
def func() :
    for i in range(1000) :
        result = compiled_script(keys=keys, args=values)
for i in range(2) :
    print(timeit.timeit(stmt=func, number=1))
print(r.get('key5'))
r.close()

多次运行的时间分别为:
0.9953755
1.0661000999999999
1.0423904
1.0659588
1.0843975

预计循环一千次的时间是 1秒钟, 平均一个lua脚本是1毫秒.

结论

lua脚本应该是极大的减少 网络交互和上下文切换的时间.
理论上执行一条redis命令是 个位数的微妙级的操作. 

所以理论上 99%的时间其实是在进行网络交互,内核网络栈, 上下文切换等动作. 
所以使用lua脚本,其实能够极大的提升程序效率. 

与Python学习之十九_程序运行时间的验证相似的内容:

Python学习之十九_程序运行时间的验证

# Python学习之十九_程序运行时间的验证 ## 背景 ``` 最近一段时间比较忙. 而且还遇到了一个lua脚本优化redis访问的场景. 想着自己还在学习python(时断时续) 所以想借着这个场景,学习一下python连接redis,以及验证lua脚本和原生redis命令的效率问题. 虽然方

Python学习之十_paramiko的简单学习

Python学习之十_paramiko的简单学习 简介 pywinrm 是python用于连接访问windows的工具 paramiko 是python用于连接访问linux的工具 ansible等工具很多也是基于类似的组件进行的处理 连接不同的系统进行命令行的操作. paramiko的简介 par

Python学习之十一_Windows获取硬件信息

Python学习之十一_Windows获取硬件信息 简介 网上找了一些方法简单整理了下,可以快速获取部分信息 包含机器名称等. 以及序列号相关 部分学习来源: https://blog.51cto.com/u_15354476/5339864 源码 import psutil import wmi

Python学习之十三_pip的学习

Python学习之十三_pip的学习 pip的含义 pip: pip is the package installer for Python. You can use pip to install packages from the Python Package Index and other in

Python学习之十八_获取神通数据库所有的表数据量

# Python学习之十八_获取神通数据库所有的表数据量 ## 背景 ``` 今天想获取一下所有数据库的表信息.但是发现神通数据库的系统表里面的表信息不正确 无法获取实际意义的表信息. 联系了下神通数据库的原厂高手. 给了一个存储过程可以进行相关的处理. 因为最近学习python(放下一周就忘记的七

Python学习之十八_django的学习(二)

# Python学习之十八_django的学习(二) ## 前言 ``` 前面学习了基本的django的使用. 这里想着稍微深入一点学习templates 以及进行级联的路由展示. ``` ## 修改配置文件 ``` 要想使用 templates下面的文件. 需要修改一下项目级别的 settings

[转帖]Python学习之十七_django的入门

# Python学习之十七_django的入门 ## 前言 ``` Python学习了一周, 慢慢总结摸索. 自己还是有多不会的地方. 感慨这些年浪费的时间. 所有的时间都是选择大于努力. 努力最多感动自己. 生活是需要的是正确的选择. 平凡的实在人太难在一个固化的社会生存. 共勉. ``` ##

gRPC入门学习之旅(十)

gRPC是一个高性能、通用的开源远程过程调用(RPC)框架,基于底层HTTP/2协议标准和协议层Protobuf序列化协议开发, gRPC 客户端和服务端可以在多种环境中运行和交互。你可以用Java创建一个 gRPC 服务端,用 Go、Python、C# 来创建客户端。本系统文章详细描述了如何创建一...

算法金 | 只需十四步:从零开始掌握Python机器学习(附资源)

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 1. 引言 1.1 教程目的与读者定位 "启程"往往是最具挑战性的一步,特别是在面临众多选择时,人们往往难以做出决策。本教程旨在帮助那些几乎没有Python机器学习基础的初学者成长为知识

Python学习之四_部分battery的学习

Python学习之四_部分battery的学习 CentOS升级pip的方法 yum install python3 之后, 一般centos的版本都很低, 有时候很多module 是无法安装的. 一般可以通过他进行升级: pip3 install -U pip 注意如果无法升级, 可以先这样处理