我有一个数字清单.该列表以两种方式存储:作为内存中的python对象,或作为redis列表(在同一服务器上重新设置).
我正在比较使用python的timeit检索这两个列表所花费的时间.这是我在python shell中所做的事情:
import timeit
import redis
POOL = redis.ConnectionPool(host='127.0.0.1',port=6379,db=0)
my_server = redis.Redis(connection_pool=POOL)
print min(timeit.Timer('pylist1 = my_server.lrange("nums:5",0,-1)', setup='from __main__ import my_server').repeat(7,1000))
这给了我时间1.92341279984.
接下来,我对内存中的python对象进行计时,如下所示:
pylist = my_server.lrange("nums:5",0,-1)
print min(timeit.Timer('pylist2 = pylist',setup='from __main__ import pylist').repeat(7,1000))
这给了我4.29153442383e-05的时间.即它似乎比从redis检索相同列表快约4.5万倍.
我的问题是:我的比较方法正确吗?即,我是否准确模拟了Redis的检索与内存中的检索?对于我所想到的用例来说,这是一个巨大的性能提升,但是在实现此用例之前,只想确保我没有对基准测试有所误解即可.
解决方法:
在这里进行的比较中,您基本上只是测量第二种情况下Python将新名称绑定到值所花费的时间.因此,这比与其他进程(Redis)进行通信要快得多,这不足为奇.我想让我感到惊讶的是,如果存在该选项只是为了将其保留在内存中,您将考虑从Redis获取值.
因此,您首先需要更加清楚为什么要使用Redis.它始终会比进程内存慢,因此不需要基准测试.您需要问“为什么我不仅仅使用Python列表和字典”?有几个有效的答案:您的数据太大而无法放入内存,您需要特定于缓存的功能,例如允许值在一段时间后消失,或者您想将其用于IPC或持久性.一旦您知道此处的答案,便会告知您要进行的基准测试.问题将更像是“如何以最少的性能损失获得上面列出的优点/功能”. Redis可能不是唯一的答案.您可能会考虑使用机架来保持持久性,甚至可能考虑使用完整的关系数据库或Mongo或其他任何东西.
简而言之,一旦您对原因有了一个很好的了解,解决问题的频率就会很高.
标签:python,redis
来源: https://codeday.me/bug/20191012/1903808.html