【发布时间】:2022-01-20 14:50:30
【问题描述】:
假设您有一个随机填充的位数组(任何数据类型都可以。例如列表、np.array、位数组、位图等布尔值)。在 Python 中“前向填充”(从左到右,或从第 0 个索引到第 n 个索引)该数组以使 n 位在每个位都设置为 1 之后设置为 1 的最快方法是什么?
例如,取下面的数组:
[01000100000]
假设 n=2,前向填充数组将是:
[01110111000]
编辑
假设输入是一个包含 10,000 个元素的位数组,其中随机 20% 为真,n=25。这可以表示为一个包含 10,000 个布尔元素的 Python 列表,其中 20% 是 True。这也可以表示为 set,其中包含 0 到 10,000 之间的 2,000 个 int 元素。
编辑 2
首先,以下是使用上述参数的一些示例:
new = set()
new.update(*[range(i, i+25) for i in existing])
# 2.34 ms ± 56.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
new = BitMap() # This is a pyroaring BitMap
for e in existing:
new.add_range(e, e+25)
# 461 µs ± 6.02 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
【问题讨论】:
-
数据类型到底是什么?
[0100010000]很模糊。 -
可以是任何数据类型。我正在寻找与最终数据类型无关的最快方法。我在问题中提到了几个:list、np.array、bitarray、bitmap、set等
-
如果不选择实际的数据结构,就不可能回答“最有效”或“最快的方式”。您需要选择一种类型并展示您尝试过的内容。例如,给定一个 bitvec(例如,使用 u64 的底层存储),您将采用与布尔列表截然不同的方法。
-
不,不应该先选择数据结构。选择的数据结构取决于实际的problem 及其context。所以,问题是:要解决的精确问题是什么。这有什么限制或用例?例如:输入是大还是小?位数是固定的吗?有界吗?等
-
@JérômeRichard 我编辑了问题以回答您的上述问题。输入相当小,数量可以固定。我同意不应该选择数据结构,因为每个数据结构都有自己的最佳答案。我正在寻找python中可用的全局最优答案。
标签: arrays python-3.x algorithm performance bit-manipulation