0

假设循环的速度是线性的(我的老师告诉我假设它,我知道这不是真的,但我们是初学者,所以我被要求计算运行此代码的平均计算机大约需要多长时间。. ):

num = 2**100
cnt = 0
import time
t0 = time.clock()
for i in range(num):
    cnt = cnt+1

t1 = time.clock()
print("running time: ", t1-t0, " sec") 

我等了 3 个小时并没有得到任何东西,所以,正如人们建议我做的那样,我计算了一个较小的输入:2**20. 这花了 0.24478681215692052 秒。

现在,我尝试以两种我认为必须得到相同结果的方式继续计算,但事实并非如此。

  1. 如果我假设循环的速度是线性的,计算2**100我只需要计算(0.24478681215692052)^5,因为(2**20)**5 = 2**100

    我得到的结果是:0.000878901251447358 秒(这真的不合逻辑)

  2. 我尝试了另一种方式:

    • 2**20- 0.24478681215692052 秒
    • 2**100- ?

    并像这样相乘:

    2**100 * 0.24478681215692052 / 2**20
    

    并得到: 296101054897497890198453.29788130608283648 秒通过使用这个计算器大数字

我怎么可能得到2个不同的答案?而且看起来都不合逻辑?

4

1 回答 1

1
    x**y * x**z = x**(y + z)

让我们证明一下

    x**y + x**z = (x * ...y times... * x) * (x * ...z times... * x) = 
    = (x * ...y+1 times... * x) * (x * ...z-1 times... * x) = 
    = ... = (x * ...y+z times... * x) = x**(y + z)

这就是为什么

    2**100 = 2**(20 + 80) = 2**20 * 2**80

所以,

    f(2**100) = f(2**20) * 2**80 = 0.24478681215692052 * 0.24478681215692052 =
    = 2.9592909751765742e+23 seconds
于 2013-10-25T17:18:08.053 回答