2013-10-25 4 views
0

Мне нужно было рассчитать примерно, сколько времени потребуется компьютеру avg для запуска этого кода, предполагая, что скорость цикла является линейной (мой учитель сказал мне предположить это, Я знаю, что это не так, но мы новички так ..):Как долго время работы кода в python

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 секунд с помощью this calculator for big numbers.

Как это возможно, что у меня есть 2 разных ответа? и не кажутся действительно логичными?

+6

'если я предполагаю, что скорость цикла является линейным, чтобы вычислить 2 * 100 Мне просто нужно вычислить (0.24478681215692052)^5, потому что (2 * 20) * 5 = 2 ** 100' Это не правильный алгебраический расчет. –

+0

2 ** 20 = 0.24478681215692052, теперь мы^5 обе стороны. почему это не так? – CnR

+1

'2 ** 20 = 0.24478681215692052' Верно ли, что 2^20 ** равно ** .2447? Ты уверен? –

ответ

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 
+0

Так каково время запуска? – martineau

+0

около 2.9592909751765742e + 23 секунды – fryday

+0

От вашей первой строки '2 ** 100 == (2 ** 20) * (2 ** 20) * (2 ** 20) * (2 ** 20) * (2 * * 20) ', так не будет ли время работы намного короче? Кажется, он занимает меньше секунды на моем компьютере. Ответ был напечатан: «1 267 650 600 228 229 401 496 703 205 376». – martineau

Смежные вопросы