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腳本,其實能夠極大的提升程序效率. 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章