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 ...
随机推荐
- 鸿蒙开发丨设备内UIAbility的几种交互方式
本文分享自华为云社区<设备内UIAbility交互:无缝体验与高级技巧>,作者: 柠檬味拥抱. UIAbility组件间交互(设备内) 在设备内,UIAbility(用户界面能力)是系统调 ...
- 大数据集群跨多版本升级、业务0中断,只因背后有TA
摘要:2021年4月21日,中国太平洋保险集团联合华为云完成了全球首例大数据集群跨多版本的大数据集群滚动升级. 本文分享自华为云社区<华为云FusionInsight助力太保跨多版本升级业务0中 ...
- OpenHarmony移植:XTS子系统之应用兼容性测试套件
摘要:本文通过实例分析下ACTS应用兼容性测试套件移植案例,以及移植过程中特定的操作的原理. 本文分享自华为云社区<移植案例与原理 - XTS子系统之应用兼容性测试套件>,作者:zhush ...
- Solon2 常用注解之 @Component 与 @Bean 的区别
@Component 与 @Bean 设计的目的是一样的,都是注册 Bean 到容器里. 1.@Component 注解 及它的子类型 @Configuration,@Controller,@Remo ...
- 语音顶会 ICASSP 2022 成果分享:基于时频感知域模型的单通道语音增强算法
近日,阿里云视频云音频技术团队与新加坡国立大学李海洲教授团队合作论文 <基于时频感知域模型的单通道语音增强算法 >(Time-Frequency Attention for Monaura ...
- Linux 下运行.NET 6 7 8 程序遇到的两个问题
一. /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found 的解决办法 1. 下载 libstdc++.so.6.0.21 文件 注意区分 ...
- 【每日一题】29.maze (BFS 进阶)
补题链接:Here 本题代码由贺佬完成 这道题基本算一道 BFS 进阶题,有少许细节要小心 (WA1发.. #include <bits/stdc++.h> #define x first ...
- 【每日一题】26.codeJan与旅行 (贪心)
补题链接:Here 算法涉及:贪心 思路: 首先,我们处在p位置,显然要么向左走到相邻的城市,要么向右走走到相邻的城市. 有一个不会证明但观察到的结论,从这两个位置走的话,只有四种可能. 可能1:一直 ...
- Educational Codeforces Round 96 (Rated for Div. 2) (A - C题个人题解)
因为火锅导致错过的上分机会,赛后发现人均AC5题 1430A. Number of Apartments 暴力搜索 #include<bits/stdc++.h> using namesp ...
- HanLP — 汉字转拼音,简繁转换 -- JAVA
目录 语料库 训练 加载语料库 训练模型 保存模型 加载模型 计算 调用 HanLP 在汉字转拼音时,可以解决多音字问题,显示输出声调,声母.韵母,通过训练语料库, 本文代码为<自然语言处理入门 ...