【发布时间】:2010-01-24 21:40:33
【问题描述】:
因此,当某物的长度接近 1
r = xrange(1<<30)
assert len(r) == 1<<30
很好,但是:
r = xrange(1<<32)
assert len(r) == 1<<32
ValueError: xrange object size cannot be reported`__len__() should return 0 <= outcome
Alex 的wowrange 也有这种行为。 wowrange(1<<32).l 很好,但 len(wowrange(1<<32)) 很糟糕。我猜这里有一些浮点行为(被解读为负面)。
- 这里到底发生了什么? (这在下面已经很好地解决了!)
- 我怎样才能绕过它? 多头?
(如果人们想直接解决这个问题,我的具体申请是random.sample(xrange(1<<32),ABUNCH))!)
【问题讨论】:
-
@Gregg,很有趣,我得到的是 OverflowError 而不是 ValueError (就像那个 Q 接受的 A 一样),但是,微乎其微。问题是,对于您的特定应用程序,您需要一个无法放入内存的
random.sample- 但每个 Python 结构必须 适合内存。如果您打开另一个 Q 并更详细地指定参数,那么提供针对特定应用程序的帮助可能会更实际... -
@Alex,实际上,样本不必放入内存,但在 2.4(我知道,旧消息!)随机模块中,它执行的 len() 调用失败了! xrange(1
-
random.sample在 Python 2.5、2.6、3.0 和 3.1 中也需要to call len(),并且每个版本中的xrange(1<<32)调用都失败(因为len()仅适用于“适合内存”,而xrange在概念上不适合)。因此,如果您更好地指定您到底需要什么,尤其是。ABUNCH的典型值是什么,我们可以建议如何解决random.sample的限制(适用于 所有 Python 版本!-)。恕我直言,在不同的 Q 中做得更好。 -
@Alex,我只是从 random.sample 方法中抽出胆量,自己编写,因为它非常微不足道。
-
当然,但如果
ABUNCH非常大,则需要采取一些预防措施(性能方面)。