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 学习笔记十九 django深入学习四 cookie,session
缓存 一个动态网站的基本权衡点就是,它是动态的. 每次用户请求一个页面,Web服务器将进行所有涵盖数据库查询到模版渲染到业务逻辑的请求,用来创建浏览者需要的页面.当程序访问量大时,耗时必然会更加明显, ...
- Python学习(十九) —— 前端基础之HTML
转载自:http://www.cnblogs.com/liwenzhou/p/7988087.html 一.HTML介绍 1.Web服务本质 import socket sk = socket.soc ...
- Python学习札记(十九) 高级特性5 迭代器
参考:迭代器 Note 1.可用于for循环的对象有两类:(1)集合数据类型:list tuple dict str set (2)Generator:生成器和含yield语句的函数.这些可以直接作用 ...
- python学习(十八) 程序打包
18.1 Distutils基础 18.2 打包 18.2.1 建立存档文件 18.2.2 创建Windows安装程序或RPM包 18.3 编译扩展 18.4 使用py2exe创建可执行程序
- Python学习日记(十九) 模块导入
模块导入 当文件夹中有这样一个自定义的command模块 在它的内部写下下列代码: print('这个py文件被调用!') def fuc(): print('这个函数被调用!') 然后我们在comm ...
- Python笔记(二十九)_模块
模块 在Python中,一个.py文件就是一个模块 if __name__ == '__main__':所有模块都有一个 __name__ 属性,__name__ 的值取决于如何应用模块 run当前文 ...
- python学习 (二十九) range函数
1:list函数可以将其他类型转成list. print(list(range(0, 10))) 2: list函数把元组转成list t = (1, 3, 3, 5) print(list(t)) ...
- Python学习第十九课——类的装饰器
类的装饰器 # def deco(func): # print('==========') # return func # # # @deco #test=deco(test) # # def tes ...
- python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法
python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法 同一台机器同时安装 python2.7 和 python3.4不会冲突.安装在不同目录,然 ...
- 学习笔记:CentOS7学习之十九:Linux网络管理技术
目录 学习笔记:CentOS7学习之十九:Linux网络管理技术 本文用于记录学习体会.心得,兼做笔记使用,方便以后复习总结.内容基本完全参考学神教育教材,图片大多取材自学神教育资料,在此非常感谢MK ...
随机推荐
- 12、FlutterMediaQuery获取屏幕宽度和高度
final size =MediaQuery.of(context).size; class HomePage3 extends StatelessWidget { const HomePage3({ ...
- Asp .Net Core系列:AutoMapper自动映射框架介绍、使用
1.介绍 AutoMapper是一个对象-对象映射器.对象-对象映射通过将一种类型的输入对象转换为另一种类型的输出对象来工作.使AutoMapper变得有趣的是,它提供了一些有趣的约定,以免去搞清楚如 ...
- GaussDB技术解读系列:高级压缩之OLTP表压缩
本文分享自华为云社区<DTCC 2023专家解读 | GaussDB技术解读系列:高级压缩之OLTP表压缩>,作者:GaussDB 数据库 . 8月16日,第14届中国数据库技术大会(DT ...
- 5分钟体验代码仓托管、CloudIDE云端代码编辑、调试、运行
摘要:您将学会如何通过代码托管(CodeHub)创建代码仓,解决软件开发者在跨地域协同.多分支并发.代码版本管理.安全性等方面的问题. 本文分享自华为云社区<5分钟体验代码仓托管.CloudID ...
- SARIF:DevSecOps工具与平台交互的桥梁
摘要:静态扫描工具融入在DevSecOps的开发过程中,对提高产品的整体的安全水平发挥着重要的作用.为了获取安全检查能力覆盖的最大化,开发团队通常会引入多个安全扫描工具.为了降低各种分析工具的结果汇总 ...
- 应对全场景AI框架部署挑战,MindSpore“四招”让你躺平
摘要:所谓全场景AI,是指可以将深度学习技术快速应用在云边端不同场景下的硬件设备上,包括云服务器.移动终端以及IoT设备等等,高效运行并能有效协同. 本文分享自华为云社区<AI框架的挑战与Min ...
- 解放重复劳动丨华为云IoT API Explorer对接小程序实现系统化应用
摘要:<物联网平台接口调用实验>详细讲解了API Explorer的应用,根据提供的接口,结合真实案例,制作了一个小程序,真正的把它应用起来,解放重复劳动,小程序是一个很好的平台,作为应用 ...
- Flutter App混淆加固、保护与优化原理
引言 在移动应用程序开发中,保护应用程序的代码和数据安全至关重要.本文将探讨如何对Flutter应用程序进行混淆.优化和保护,以提高应用程序的安全性和隐私. 一.混淆原理 混淆是一种代码保护技术, ...
- UltraEdit 去除文本中的空行,按指定字符换行
在将JSON格式的数据,整理到 Excel中查看时,可以通过文本替换的方式将JSON存到csv 后,使用 UltraEdit 编辑工具按需进行替换处理 去除多个空行 ^p^p 替换成 ^p 按逗号换 ...
- java中类的普通初始化块一定在静态初始化块后运行吗
大部分教程都会告诉我们静态初始化块和静态字段总是在初始化块和普通类字段前运行,事实上也确实如此,直到我看到下面这样的代码: public class Test { static Test test = ...