在python中对redis与内存的检索进行基准测试(使用timeit)



我有一个数字列表。该列表以两种方式存储:要么作为内存中的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的时间。也就是说,~45K似乎比从redis检索相同的列表快。

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

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

所以,你需要更清楚为什么你在第一时间使用Redis。它总是比进程内内存慢,不需要基准测试。你需要问"为什么我不只是使用Python列表和字典"?有几个有效的答案:您的数据太大而无法装入内存,您需要特定于缓存的功能,例如允许值在一段时间后消失,或者您希望将其用于IPC或持久性。一旦您知道了这里的答案,这将告知您想要执行的基准测试。问题将更像是"我如何以最小的性能损失获得我上面列出的好处/特性"。Redis可能不是唯一的答案。您可以考虑将shelf用于持久化,或者甚至是一个完全的关系数据库或Mongo或其他。

简而言之,一旦你知道了为什么,事情就会自然而然地发生。

最新更新