一尘不染

在Python中使用Redis与内存进行基准检索(使用timeit)

redis

我有一个数字清单。该列表以两种方式存储:作为内存中的python对象,或作为redis列表(在同一服务器上设置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的检索与内存中的检索?对于我所想到的用例来说,这是一个巨大的性能提升,但是在实现这一用例之前,只想确保我没有对基准测试有所误解即可。


阅读 253

收藏
2020-06-20

共1个答案

一尘不染

在这里进行的比较中,您基本上只是测量第二种情况下Python将新名称绑定到值所花费的时间。因此,这比与其他进程(Redis)进行通信要快得多,这不足为奇。我想让我感到惊讶的是,如果存在该选项只是为了将其保留在内存中,您将考虑从Redis获取值。

因此,您首先需要更加清楚为什么要使用Redis。它总是比进程内内存慢,因此不需要基准。您需要问“为什么我不仅仅使用Python列表和字典”?有几个有效的答案:您的数据太大而无法容纳到内存中,您需要特定于缓存的功能,例如允许值在一段时间后消失,或者您想将其用于IPC或持久性。一旦您知道此处的答案,便会告知您要进行的基准测试。问题将更像是“如何以最少的性能损失获得上面列出的优点/功能”。Redis可能不是唯一的答案。您可能会考虑shelf持久性,甚至可能会考虑使用完整的关系数据库或Mongo或其他任何东西。

简而言之,一旦您对原因有了一个很好的了解,解决问题的频率就会很高。

2020-06-20