【发布时间】:2020-09-23 18:18:17
【问题描述】:
我正在尝试计算以下两个的大指数:2^48572234(*注意:这是一个示例,不是我正在计算的数字之一)。但是,python 用于提高指数的内置符号在此任务上相当慢:
number = 2**<exponent>
在我的计算机上完成这项任务需要 80 多个小时(使用上面的示例)。但是,更快的方法可能是pow。这是一个例子:
number = pow(<exponent>)
总共需要 68 小时。但这仍然太长,尤其是当指数开始变得非常大时。另一种方法是使用math.pow 函数,但使用OverflowError 会出错。
我还尝试了另一种方法,我将n 的数量附加到一个字符串中,将其转换为int 并添加一个以获得答案。这将类似于以下方法:
def genExponent(n): # generate large exponents of two.
x = ""
for i in range(n):
x += "1"
z = int(x,2)
z+=1
return z
但是,在我的示例中,这种方法在 72 小时内与其他方法一样慢。
有人对更高效的算法有任何想法吗?
【问题讨论】:
-
使用您的示例,
2^48572234将是一个需要大约 48 兆位/6 兆字节来存储和表示的数字(2^X需要X+1位)。地球上没有一个处理器可以使用硬件加速来计算这样的数字,所以这将仅使用软件来完成。因此,计算需要一段时间也就不足为奇了。 -
不过,要使用该属性,以迂回的方式计算它可能会更容易。二进制中的
2^X是 1 后跟 X 个零,因此不是用数学方法计算它,另一种方法可能是构造该字符串,然后将其解析为一个(非常大的)整数。 -
在我说我试过的问题中*
-
对于这些大小,您应该考虑使用指数表示。你会用这个数字做什么:在结果中加 1?它不会有任何效果。
-
说实话,我真的不想用它做任何事情——我只是想看看我是否可以,以及计算它的最快选择是什么。
标签: python python-3.x performance exponent