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

时间:2016-10-23 13:25:44

标签: python 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检索相同列表快<〜> 45K 快。

我的问题是:我的比较方法是否正确?即,我是否准确地模拟了从redis中检索到从内存中检索?对于我想到的用例来说,这是一个巨大的性能提升,但在我实现之前,只是想确保我没有捏造基准测试。

1 个答案:

答案 0 :(得分:1)

在您已经提到的比较中,您基本上只是测量Python在第二种情况下将新名称绑定到值所花费的时间。因此,与使用不同的流程(Redis)进行通信相比,这并不会让我感到惊讶。我想让我感到惊讶的是,你会考虑从Redis获取一个值,如果该选项存在只是为了将其保留在内存中。

因此,您需要更清楚地知道为什么首先使用Redis。它总是比进程内存慢,不需要基准。你需要问&#34;为什么我不只是使用Python列表和字典&#34;?有几个有效的答案:您的数据太大而无法容纳到内存中,您需要特定于缓存的功能,例如允许值在一段时间后消失,或者您希望将其用于IPC或持久性。一旦你知道答案,这将告知你想要做的基准测试。问题将更像是&#34;我如何获得上面列出的最低性能损失的好处/功能&#34;。 Redis可能不是唯一的答案。您可以考虑shelf持久性,或者甚至是全关系数据库或Mongo等等。

简而言之,一旦你对原因有所了解,就会经常解决这个问题。