0
random.sample(range(2**31 - 1), random.randrage(1, 100))

这导致:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError

我在具有 6GB RAM 的 ubuntu 12.04 64 位上运行 python 2.7.3。

我认为 2**31 -1 是 32 位计算机中整数的正常上限。我仍然低于 1 并且出现内存错误?

4

1 回答 1

8

您可能指的是语言中整数的限制,例如C通常int为 4 个字节的语言。在 Python 2.7 中,整数没有限制,并在需要时自动提升为更大的类型,保持无限精度。您的问题与此没有直接关系,您正在尝试创建一个需要大量内存的每个数字的列表02**31-1因此MemoryError.

您不需要创建此列表,只需使用xrangewhich 懒惰地评估:

>>> random.sample(xrange(2**31 - 1), random.randrange(1, 100))
[248934843, 2102394624, 1637327281, 352636013, 2045080621, 1235828868, 951394286, 69276138, 2116665801, 312166638, 563309004, 546628308, 1890125579, 699765051, 1567057622, 656971854, 827087462, 1306546407, 1071615348, 601863879, 410052433, 1932949412, 1562548682, 1772850083, 1960078129, 742789541, 175226686, 1513744635, 512485864, 2074307325, 798261810, 1957338925, 1414849089, 1375678508, 1387543446, 1394012809, 951027358, 1169817473, 983989994, 1340435411, 823577680, 1078179464, 2051607389, 180372351, 552409811, 1830127563, 1007051104, 2112306498, 1936077584, 2133304389, 1853748484, 437846528, 636724713, 802267101, 1398481637, 15781631, 2139969958, 126055150, 1997111252, 1666405929, 1368202177, 1957578568, 997110500, 1195347356, 1595947705, 2138216956, 768776647, 128275761, 781344096, 941120866, 1195352770, 1244713418, 930603490, 2147048666, 2029878314, 2030267692, 1471665936, 1763093479, 218699995, 1140089127, 583812185, 1405032224, 851203055, 1454295991, 1105558477, 2118065369, 1864334655, 1792789380, 386976269, 1213322292, 663210178, 1402712466, 1564065247]

xrange不是生成器- 它是一个延迟计算的序列对象。它支持几乎所有相同的方法,range但不需要将其数据存储在列表中。(在 Python 3 中它简称为range)。因此它有一个长度,并且random.sample可以立即访问它以从中挑选k项目。

注意:关于2**31-1(在 32 位上,sys.maxint对于您的特定系统)是最大的数字,您在某种意义上是正确的,因为xrange上限有限制(但这并不意味着 Pythonint有最大大小)还请注意Python3用普通的range.

>>> random.sample(xrange(2**31), random.randrange(1, 100))

Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    random.sample(xrange(2**31), random.randrange(1, 100))
OverflowError: Python int too large to convert to C long
于 2013-06-06T13:29:41.137 回答