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.xx.xxx', port=36379, password='Testxxxx',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')

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.xx.xxx', port=36379, password='Testxxxx',db=0)

keys = ['key1', 'key2', 'key3', 'key4', 'key5']
values = ['value1', 'value2', 'value3', 'value4', 'value5']

script = """
redis.call('SET', KEYS[1], ARGV[1])
"""
compiled_script = r.register_script(script)

def func() :
    for i in range(1000) :
        result = compiled_script(keys=keys, args=values)

print(timeit.timeit(stmt=func, number=1))
r.close()

多次运行的时间分别为:
0.9953755
1.0661000999999999
1.0423904
1.0659588
1.0843975

预计循环一千次的时间是 1秒钟, 平均一个lua脚本是1毫秒.

结论

lua脚本应该是极大的减少 网络交互和上下文切换的时间.
理论上执行一条redis命令是 个位数的微妙级的操作. 

所以理论上 99%的时间其实是在进行网络交互,内核网络栈, 上下文切换等动作. 
所以使用lua脚本,其实能够极大的提升程序效率. 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章