我需要计算大约需要多长时间才能运行此代码,假设循环的速度是线性的(我的老师告诉我假设它,我知道这不是真的,但我们是初学者所以..):
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秒。
现在,我尝试以两种方式继续计算,我认为必须得到相同的结果,但事实并非如此。
如果我假设循环的速度是线性的,要计算2**100
我只需计算(0.24478681215692052)^5
,因为(2**20)**5 = 2**100
。
我得到的结果是:0.000878901251447358秒(这真的不合逻辑)
我尝试了另一种方式:
2**20
- 0.24478681215692052 sec 2**100
- ? 并像这样繁殖:
2**100 * 0.24478681215692052 / 2**20
并使用this calculator for big numbers得到:296101054897497890198453.29788130608283648秒。
我怎么可能得到2个不同的答案?而且似乎都不符合逻辑?
答案 0 :(得分: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