0
点赞
收藏
分享

微信扫一扫

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



举报

相关推荐

0 条评论