所以,当某个东西的长度接近于1<<32(一个整数的大小)时,cPython(2.4)会有一些有趣的行为。
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))
,如果有人想直接解决这个问题!)
random.sample
--但每个Python结构体必须适应内存。如果您打开另一个问题并更详细地指定参数,也许可以为特定应用程序提供帮助... - Alex Martellirandom.sample
需要调用len()
,而且在每个版本中都会在xrange(1<<32)
上失败(因为len()
仅适用于“适合内存”的容器,而xrange
在概念上并不适用)。因此,如果您能更好地说明您需要什么,特别是ABUNCH
的典型值是多少,我们可以建议如何解决random.sample
的这个限制(这适用于所有Python版本!)。 在我看来,最好在另一个问题中进行。 - Alex MartelliABUNCH
非常大,那么在性能方面需要采取一些预防措施。 - Alex Martelli