这段代码快速完成了哪些优化?

时间:2016-10-12 17:22:01

标签: python python-3.x optimization

我正在解决我遇到的一个问题,从0到2009 mod 8的3的幂的总和是多少。

我用笔和纸得到了答案,并尝试用一些简单的python验证它

print(sum(3**k for k in range(2010)) % 8)

我很惊讶它回复的速度有多快。我的问题是解释器使用什么优化或技巧来快速得到答案?

3 个答案:

答案 0 :(得分:4)

没有,这对计算机而言并不是很多计算。

您的代码相当于:

>>> a = sum(3**k for k in range(2010))
>>> a % 8
4

a是一个959位的数字 - 询问计算机并不是一项大任务。

尝试在2010的末尾加上两个零,你会发现它需要花费相当多的时间。

答案 1 :(得分:3)

工作中唯一的优化是使用与3**k中的位数成比例的多个乘法来评估k的每个实例(它乘以3本身k-1次)。

如前所述,如果将2010年提升至20100或201000或......,则需要更长时间,因为3**k变得非常大。但是,在这些情况下,你可以通过将其重写为例如

来再次加速
print(sum(pow(3, k, 8) for k in range(201000)) % 8)

在内部,pow(3, k, 8)仍会进行与k中的位数成比例的多次乘法,但不需要保留内部大于约8 ** 2的任何整数(模数的平方)。

答案 2 :(得分:1)

没有花哨的优化对您观察到的快速响应负责。从绝对意义上讲,计算机的速度比预期的要快得多。