Python中13位数字的范围和xrange?

时间:2010-02-02 19:49:17

标签: python range numbers xrange

range()xrange()适用于10位数字。但13位数字怎么样?我在论坛上找不到任何东西。

9 个答案:

答案 0 :(得分:12)

你可以试试这个。与范围相同的语义:

import operator
def lrange(num1, num2 = None, step = 1):
    op = operator.__lt__

    if num2 is None:
        num1, num2 = 0, num1
    if num2 < num1:
        if step > 0:
            num1 = num2
        op = operator.__gt__
    elif step < 0:
        num1 = num2

    while op(num1, num2):
        yield num1
        num1 += step

>>> list(lrange(138264128374162347812634134, 138264128374162347812634140))
[138264128374162347812634134L, 138264128374162347812634135L, 138264128374162347812634136L, 138264128374162347812634137L, 138264128374162347812634138L, 138264128374162347812634139L]

根据itertools.islice的{​​{3}}

中的建议,另一种解决方案是使用xrange

答案 1 :(得分:6)

创建范围没有问题,只要您不需要10 ** 13个元素,例如

range(10**14,10**15,10**14)

给出

[100000000000000, 200000000000000, 300000000000000, 400000000000000, 500000000000000, 600000000000000, 700000000000000, 800000000000000, 900000000000000]

答案 2 :(得分:6)

如果您需要使用itertools枚举整数尝试:

itertools.count(1000000000000)

它不应为1000000000000元素列表

分配内存

答案 3 :(得分:2)

在64位Python上:

>>> xrange(9999999999999)
xrange(9999999999999)

我不会将range()用于13位数字。我糟糕的机器将无法保存结果列表。

答案 4 :(得分:2)

我认为它不会起作用。像len这样的函数期望结果适合4字节整数,这是由于cPython实现中的限制。

在Python 3.0中:

>>> range(9999999999999)
range(0, 9999999999999)

它看起来很有效,但是......

>>> len(range(9999999999999))
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    len(range(9999999999999))
OverflowError: Python int too large to convert to C ssize_t

有关相关问题,请参阅here

答案 5 :(得分:1)

range(x)返回一个list.Python列表不能包含那么多元素。如果需要进行数万亿次循环,你应该使用xrange()迭代这些数字。?

答案 6 :(得分:1)

range()和xrange()适用于最新版本的Python;但是,在2.5或更少时,你需要解决int到long转换。

def irange(start, stop=None, step=1):
    if stop is None:
        stop = long(start)
        num = 1L
    else:
        stop = long(stop)
        num = long(start)
    step = long(step)
    while num < stop:
        yield num
        num += step

这不是一个完整的解决方案(它不会处理否定步骤),但它应该让你前进。

答案 7 :(得分:0)

range()和xrange()之间的区别在于第一个返回整个列表,而第二个返回一个生成器,根据需要生成每个数字。第二个应该适用于任何数字,无论多大。

在Python 3.0中,xrange()已经消失,range()的行为与之前的xrange()相似。

答案 8 :(得分:0)

为了解决这个问题,你不需要这么长的数字,因为你只需要素因子,你可以使用平方根:

for i in xrange(2, int((n+1)**0.5)):