gpt4 book ai didi

python - Redis 在位数组上的性能

转载 作者:IT王子 更新时间:2023-10-29 06:06:02 25 4
gpt4 key购买 nike

作为测试,我在纯 Python 和 Redis 中实现了一个简单的位操作程序。我将我的位数组表示为一个简单的 Python 列表(尽管我完全了解 bitstring 等库),并在 Redis 中表示为一个字符串(因为根据文档,“使用特殊命令可以处理像位数组一样的字符串值”)。

下面,在 Python 和 Redis 中初始化一个位数组(注意第一次调用 SETBIT 创建结构),然后测量将 100000 位设置为 1,首先在 Python 中,然后在 Redis 中:

import random
import redis
db = redis.StrictRedis(host="localhost", port=6379, db=0)
print("Connected" if db.ping() else "Connection problem!")
db.flushdb()

m = 2 ** 23 # bit array size
n = 10 ** 5 # number of insertions

bit_array = [0] * m
db.setbit("bit_array", m, 0)

random.seed(42)
indexes = [random.randrange(m) for _ in range(n)]

%timeit for i in indexes: bit_array[i] = 1
%timeit for i in indexes: db.setbit("bit_array", i, 1)

结果:

Connected
5.75 ms ± 849 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
4.71 s ± 70 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

因此,Redis 似乎比朴素的 Python 结构近 1000 倍。我做错了什么吗?


更新

按照 Žilvinas Jocius 的建议,我将这些命令封装在一个管道中:

%%timeit
pipe = db.pipeline()
for i in indexes:
pipe.setbit("bit_array", i, 1)
pipe.execute()

结果:

1.07 s ± 16.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

所以,这有帮助,但 Redis 仍然慢几个数量级。

最佳答案

问题是您正在以同步方式操作数据库。在每次 setbit 操作之后,您都在等待响应,然后才发起另一个请求。为避免这种情况,请使用 multi / pipeline 。尝试创建管道,将所有请求设置为一个批处理,然后只 执行它。这取决于您使用的是哪个 python redis 客户端,但它应该是这样的:

pipe = r.pipeline()

pipe.set('foo', 'bar')
pipe.set('baz')
pipe.execute()

关于python - Redis 在位数组上的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54827108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com