Python中针对13位数字的range和xrange函数是什么?

12

range()xrange() 可以处理10位数字,但是对于13位数字呢?我在论坛里没有找到任何相关信息。


相关:https://dev59.com/Y0vSa4cB1Zd3GeqPfIia - Mark Byers
你究竟想做什么?为什么需要这么大的范围? - Mark Byers
暴力破解不是解决projecteuler #15问题的方法!如果你每秒尝试1000000条路径,你将等待很长时间——超过一天。 - John La Rooy
2
是的,用这种方法可能会遇到60秒项目欧拉准则的问题。 - Ramashalanka
1
相关:https://dev59.com/hHM_5IYBdhLWcg3wMgEF - jfs
显示剩余4条评论
9个回答

12
您可以尝试这个。与range相同的语义:
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,正如在xrange文档中所建议的那样。


6

只要你不需要超过10的13次方的元素,创建范围就没有问题。

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

提供

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

这在 xrange 上不起作用,因为它只适用于 32 位数字 (在 32 位系统上)。 - Glenn Maynard
没错。我的系统是64位的,所以xrange只能工作到sys.maxint = 2^63-1约10^19。 - Ramashalanka

6

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

itertools.count(1000000000000)

不应该为一个包含 1000000000000 个元素的列表分配内存


2

在64位Python环境下:

>>> xrange(9999999999999)
xrange(9999999999999)

对于一个13位数,我不会使用range()函数。我的电脑无法容纳结果列表。


如果我在Python 2.5中尝试这个操作,会出现“OverflowError: long int too large to convert to int”的错误。 - Mark Byers
有趣。我这里正在运行2.6版本。已更新。 - Ignacio Vazquez-Abrams
我在2.6.2中遇到了“OverflowError”。 - MAK
3
可能是因为我正在运行64位的Python。 - Ignacio Vazquez-Abrams

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

这里有一个相关问题,可以参考此处


1

在Python的最新版本中,range()和xrange()都可以使用;但是,在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

这不是一个完整的解决方案(它不能处理负步长),但它应该能让你开始。


1

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


0

对于这个问题的解决方案,您不需要使用如此长的数字,因为您只需要质因数,可以使用平方根:

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

0
range()和xrange()的区别在于前者返回整个列表,而后者返回一个生成器,按需生成每个数字。第二个函数适用于任何大小的数字。
在Python 3.0中,xrange()已经消失了,而range()的行为与先前的xrange()相同。

不幸的是,在Python 2.7中,xrange也不支持long整数。例如:表达式xrange(sys.maxint, sys.maxint+10)会引发OverflowError: Python int too large to convert to C long异常。 - typeracer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接