当前位置: 首页 > 面试题库 >

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

公风史
2023-03-14
问题内容

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


问题答案:

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

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

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



 类似资料:
  • 问题内容: 我还没有使用过Redis,但我听说过它,并打算尝试将其作为缓存存储。 我听说Redis使用内存作为缓存存储数据库,那么如果我使用变量作为对象或字典数据类型来存储数据有什么区别?喜欢: Redis有什么优势? 问题答案: Redis是一个 远程 数据结构服务器。这肯定比仅将数据存储在本地内存中要慢(因为它涉及套接字往返来获取/存储数据)。但是,它也带来了一些有趣的属性: 应用程序的所有进

  • 问题内容: 我们有一个使用OpenSSL的Python绑定的Linux应用程序,我怀疑它会导致随机崩溃。有时,我们会看到它崩溃并显示以下消息: Python致命错误:GC对象已被跟踪 这似乎是库方面的编程错误,或者是内存损坏的症状。给定一个核心文件,有什么办法知道它执行的最后一行Python源代码?还是如果它附加在GDB中?我意识到这可能是所有已编译的字节码,但是我希望那里有人解决了这个问题。当前

  • 问题内容: 我需要存储他们购买的客户和汽车的基本数据以及这些汽车的付款时间表。这些数据来自用Python编写的GUI。我没有足够的经验来使用像sql这样的数据库系统,所以我想将数据以纯文本格式存储在文件中。而且它不必在线。 为了能够搜索和过滤它们,首先,我将数据(列表列表)转换为字符串,然后在需要将数据重新转换为常规Python列表语法时使用。我知道这是一种蛮力的方式,但是这样做安全吗?或者您可以

  • 问题内容: 我将如何存储my_dict并使用Redis进行检索。例如,以下代码不起作用。 问题答案: 您可以通过(使用来设置多个键)来做到这一点。

  • 问题内容: Python程序是否有办法确定当前正在使用多少内存?我已经看到了有关单个对象的内存使用情况的讨论,但是我需要的是该过程的总内存使用情况,以便可以确定何时需要开始丢弃缓存的数据。 问题答案: 这是适用于各种操作系统(包括Linux,Windows 7等)的有用解决方案: 在我当前使用psutil 5.6.3安装的python 2.7中,最后一行应为 相反(API发生了变化)。 注意:如果

  • 我想在内存使用效率方面比较Java程序的不同实现。有不同的使用场景被表述为JUnit测试用例。实际上,所有的代码都是开源的:https://github.com/headissue/cache2k-benchmark 获取Java程序已用内存的一般方法是:,当然也可以使用JMX接口来获取这些值。 但是,已使用内存的确定值不可靠。可能的原因: 可能有未收集的垃圾 有碎裂,如果GC没有压缩 到目前为止