【问题标题】:Create a list like object using a bitarray使用位数组创建类似对象的列表
【发布时间】:2013-08-01 15:53:19
【问题描述】:

我需要在 Python 中跟踪一组可能有 1000 万个数字。 (所有数字都在 0 到 2^32 之间)。我会事先知道整数的最大值,并且在 0 和最大值之间,20-80% 的值将在集合中。

我当前的代码使用内置的set。这种方式太慢了。就性能而言,最好的方法是使用位数组(例如 https://pypi.python.org/pypi/bitarray/ )。

我很容易使用位数组来构建具有add(n)remove(n) 方法的类。我不知道该怎么做是支持for n in bitarray_set:。我想我需要使用迭代器或可迭代的,但我不知道该怎么做。这可能吗?怎么样?

【问题讨论】:

  • 可能的 40 亿个数字中的 1000 万个数字对于 bitset 可能效率不高。你可能需要一些更聪明的东西。
  • @user2357112 - 我添加了更多细节,为什么它是高效的
  • 好吧,这应该很有效。

标签: python data-structures bitarray


【解决方案1】:

bitarrays 支持itersearch 方法,该方法迭代一个位数组出现在另一个位数组的所有位置。使用它:

def __iter__(self):
    return self.bits.itersearch(bitarray([True]))

【讨论】:

  • 这给出了一个段错误[1]: from bitarray import * In [2]: b = bitarray([True, False, True, True, False]) In [3]: b.itersearch( bitarray([True])) zsh: 分段错误 ipython
  • 在你发布的时候发现了段错误并提交了github.com/ilanschnell/bitarray/issues/12
  • 我看不出问题出在哪里。看起来像 bitarray 模块中的错误;即使我以某种方式误解了界面,这也不应该是段错误。
  • 如果 bitarray 不够稳定,可以使用 numpy 数组。该界面不太方便,您需要做更多的工作以适当大小的块调用packbitsunpackbits,但它仍然可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
相关资源
最近更新 更多