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腳本,其實能夠極大的提升程序效率.