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 ...
随机推荐
- Windows10 Docker安装详细教程
前言: 在上一章节已经成功的在Linux CentOS 8.4远程服务器中安装了Docker,下面让我们一起来试试如何在Windows10中安装Docker并运行起来.有人说你既然在Linxu环境中安 ...
- GaussDB(for Redis)游戏实践:玩家下线行为上报
本文分享自华为云社区<GaussDB(for Redis) 游戏实践:玩家下线行为上报>,作者:GaussDB 数据库 为保护未成年人的身心健康,2007年国家推出网络游戏防沉迷系统,对未 ...
- 带你了解 HBase 数据模型和 HBase 架构
摘要:HBase 是一个面向列的 NoSQL 数据库. 本文分享自华为云社区<HBase 架构:HBase 数据模型 & HBase 读/写机制>,作者: Donglian Lin ...
- PPT 求职应聘:如何利用时间轴去展示
顺序逻辑的梳理 线条 竖直排列 图形结合
- Error unprotecting the session cookie.The payload was invalid.
.Net Core 3.0 warn: Microsoft.AspNetCore.Session.SessionMiddleware[7] Error unprotecting the session ...
- xv6book阅读 chapter1
xv6book主要研究了xv6如何实现它的类Unix接口,但是其思想和概念不仅仅适用于Unix.任何操作系统都必须将进程多路复用到底层硬件上,相互隔离进程,并提供受控制的进程间通信机制. 1 了解xv ...
- 【OpenSSL】Visual Studio 2019配置OpenSSL 3.0开发环境
OpenSSL从1.0.2版本升级为3.0.3版本后,需要对代码进行重构.如果不可用的代码太多,需要重新开一个项目.重新配置开发环境. [第一步]登录http://slproweb.com/,下载Wi ...
- Find (and kill) process locking port 9000 on Mac
You can try netstat netstat -vanp tcp | grep 9000 For macOS El Capitan and newer (or if your netstat ...
- Puppeteer 入门与实战
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/P-YdQPOQ9GZgjDEP7VG8ag作者:Wang Zhenzheng Puppetee ...
- 如何在公司项目中使用 WebSocket— 入门实战指南
本文从 WebSocket 基础概念出发,介绍在实际开发中从本地联调到部署上线的流程以及注意事项,让 WebSocket 小白以最小成本应用到项目中. 一.WebSocket 基础 1.什么是 Web ...