为什么python不是';t在所有区域处理大量数据?
我在做一个谜题,我必须处理10^18阶的数字。然而,我发现python无法在所有领域处理大量数据 具体地说,如果我们指定a=10000000000000000(10^18)并进行基本的算术计算(+、-、/、*),它将响应。但是,当我在range()中使用它时,它会显示Overflowerrror为什么python不是';t在所有区域处理大量数据?,python,largenumber,Python,Largenumber,我在做一个谜题,我必须处理10^18阶的数字。然而,我发现python无法在所有领域处理大量数据 具体地说,如果我们指定a=10000000000000000(10^18)并进行基本的算术计算(+、-、/、*),它将响应。但是,当我在range()中使用它时,它会显示Overflowerrror >a=10000000000000000 >>>a/2 500000000000000000L >>>a*2 200000000000000L >>>a+a 200000000000000L >>>a*
>a=10000000000000000
>>>a/2
500000000000000000L
>>>a*2
200000000000000L
>>>a+a
200000000000000L
>>>a*a
10000000000000000000000000000l
>>>射程(a)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
射程(a)
OverflowerError:range()结果的项太多
>>>xrange(a)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
xrange(a)
溢出错误:Python int太大,无法转换为C long
我使用了Python 2.7
我想在Python2.7中使用inbuild函数来实现这一点。这不可能吗?在Python2.x中,
range
和xrange
仅限于使用Clong
,而您的大整数太大了。此限制仅是由于对range
和xrange
所做的实现选择造成的
在Python3.x中,该限制已被删除,您可以使用非常大的整数执行range()
>>> range(2**128)
range(0, 340282366920938463463374607431768211456)
政府这样说:
range()
现在的行为类似于过去的xrange()
,只是它可以处理任意大小的值。后者已不复存在
在Python2.x中,
range()
函数返回一个列表。显然,不可能为非常大范围的所有元素分配内存。xrange()
函数返回一个xrange
对象。将其描述为“一种不透明的序列类型,它产生与相应列表相同的值,而实际上不同时存储它们”。文件接着说:
xrange()
旨在简单快速。实现可能会施加限制以实现这一点。Python的C实现将所有参数限制为本机C long(“short”Python整数),并且还要求元素的数量适合本机C long
这解释了Python2.x中的限制
我不太确定在非常大的范围内使用新的Python3支持可以做什么。例如,我不建议您尝试以下方法:
2**128 in range(2**128)
这将持续很长时间
您可以在注释中指出,您正在编写代码,以计算一个较大的数字。在Python中,您可以通过以下代码轻松实现这一点:
i = 0
while i<N:
doSomething(i)
i += 1
i=0
虽然我您的问题是Python 2.7中的range()构造了一个包含该范围内每个值的显式列表——您根本没有足够的资源来构造这样的列表
Python3纠正了这种行为-并且只根据需要计算值。。。好像是由生成器表达式生成的
Python2 xrange()函数对您没有帮助,因为它只能注册值。。。对于Python2来说,这是一个折衷方案,它避免了range()对于任何不是非常小的数字的巨大开销
一种方法可能是定义您自己的生成器,该生成器迭代任意整数-类似于:
def genrange(min,max,stride=1):
val=min
while val<max:
yield val
val+=stride
def genrange(最小、最大、步幅=1):
val=min
虽然我怀疑你是否能以正确的方式解决你的难题。在今天的计算机上,用python数到10^18大约需要10000年的时间。@Surya你想做什么?你不能指望数到10000000000000000000000000000000000000000000000000000
。这将需要很长时间。没有有效的方法来计算这么多的数字,因为数字太多了。我认为你最好的办法是用你的谜题的链接或描述更新这个问题,并询问如何继续的提示。听起来你在处理一个递归关系,而这个问题有这么多数字的原因是为了确保这个问题不能用暴力解决。我会尝试得到一个forumla,它直接产生第n个数字。如果这样做失败,请尝试推断哪些数字可能不是序列的一部分,以便排除需要搜索的大部分数字。这可能是一种使用类似range()的函数的方法(可能效率不高)。但是,我可以直接使用while()而不是将其放在函数中。我认为它甚至可以降低时间复杂度。(不确定)我认为我应该找到另一种解决方案,因为达到N通常是不可能的。小调:在现代Python 3中,2**128范围内(2**128)
将立即运行,因为\uuuu包含
是特殊情况。
def genrange(min,max,stride=1):
val=min
while val<max:
yield val
val+=stride