正文
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脚本,其实能够极大的提升程序效率.