Pull to refresh

Comments 10

Это — да, перл. Столько написать, когда решение в одну строчку:

powers = [i**200000 for i in range(11)]
спасибо, согласен. Но вопрос был о функциях, мне показалось это полезным
У вас в «быстром» варианте очевидная ошибка — вы инициализируете переменную total_2 в теле цикла, а нужно — до него. Ну и про сам цикл я лучше промолчу.

А как переместите инициализацию, так и получите одинаковые времена.
просто добавить 1, то этой займет больше времени, чем само возведение в 200000 степень.

Возведение в степень заняло 24 мс, прибавление единицы — 0.024 мс, судя по вашему скриншоту. Так почему вы утверждаете, что прибавление заняло больше времени?


Быстрее, кстати, не стало. Total time во втором случае фальшивый, вы просто второй раз выводите время последней итерации.

Наглядное пособие о том, как не надо писать бенчмарки. «Прогрева» нет, операции выполняются по одному разу (оценивать стоит по avg/med), ну и откровенные баги с подсчётом времени, которые уже указали выше.
  1. функция power_2 бесполезна и её результат аналогичен обычному range(11)
  2. if i < 11: бесполезен, range(11) последним числом вернет 10
    >>> list(range(11))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  3. переменные в теле цикла не инициализируют, например d = 0 и d += i**200000 фактически просто прибавление i**200000 к нулю.

Итого после исправления некоторых ошибок:


>>>
>>>
>>> d = 0
>>> total_2 = 0
>>>
>>> for i in range(1, 11):
...     start = time()
...     d += i**200000
...     end = time()
...     total_2 += end - start
...     # print('Iteration {} lasts {}'.format(i, round(total_2, 6)))
...
>>> print('    \n End with total time {} \n'.format(round(total_2,3)))

 End with total time 0.077

>>>
>>>
>>>
>>> from time import time # импорт модуля времени
>>>
>>>
>>> total_1 = 0
>>>
>>> def power_1(x):
...     global total_1
...     start = time()
...     power = x**200000
...     end = time()
...     total_1 += end - start
...     return round(total_1,6)
...
>>> # простые операции сложения, для того что бы посчитать отдельно время операции
... power_1(1) + power_1(2) + power_1(3) + power_1(4) + power_1(5) + power_1(6) + power_1(7) + power_1(8) \
... + power_1(9) + power_1(10)
0.308704
>>>
>>> print('    \n End with total time {} \n'.format(round(total_1,3)))

 End with total time 0.078

Тут бы еще поправить подсчет времени – сложение для больших чисел, как вы заметили, тоже требует времени, а оно тут не учитывается. Очевидно, что при исправлении ошибок код эквивалентен.

Спасибо за коррекцию. Только сейчас увидел ответ. учту замечания.
Стоит почитать про генераторы и итераторы в Python перед тем как писать подобные статьи.
Согласен. Скорее писал что бы самому не забыть )
Sign up to leave a comment.

Articles