Top.Mail.Ru

Перечень алгоритмов

3. Оценка производительности способов итераций по списку

Для оценки производительности способов итерации по числовому списку будем использовать   модуль timeit.

Измерения производятся с помощью класса Timer. Конструктор класса имеет следующий формат:

timeit.repeat(stmt, setup, number, repeat)

В параметрах указываются:

  • stmt - код (в виде строки), время выполнения которого необходимо измерить
  • setup - указывается код (в виде строки), который будет выполнен перед измерением времени выполнения кода в параметре stmt
  • number – указывается количество повторений. Если параметр не задан, то по умолчанию равен 1_000_000
  • Метод timeit.repeat вызывает метод timeit() указанное в параметре repeat количество раз и возвращает список значений.

Для оценки производительности способов итерации по числовому списку создадим список из 10 000 элементов перед измерением затраченного времени для каждого способа.

Каждый способ повторим 1000 раз, а затем создадим список из 5 запусков timeit и найдем минимальное значение в этом списке. Так мы получим оценочное время выполнения способов итерации по числовому списку.

Вот код:

import timeit
setup =
"""
a = [x for x in range(10_000) ]
# """

Способ_1 = """
for x in a:
     z=x
"""
Способ_2 = """
for i in range(len(a)):
   z = a[i]
"""
Способ_3 = """
n = len(a)
i = 0
while i<n:
   z=a[i]
   i+=1
"""
Способ_4 = """
[x for x in a]
"""

Способ_5 = """
for i, item in enumerate(a):
       z=item
"""
Способ_6 = """
it = iter(a)
try:
   while True:
       z = next(it)
except StopIteration:
   pass
"""
sp1 = min(timeit.repeat(stmt=Способ_1, setup=setup, number = 1_000, repeat=5))
sp2 =
min(timeit.repeat(stmt=Способ_2, setup=setup, number = 1_000, repeat=5))
sp3 =
min(timeit.repeat(stmt=Способ_3, setup=setup, number = 1_000, repeat=5))
sp4 =
min(timeit.repeat(stmt=Способ_4, setup=setup, number = 1_000, repeat=5))
sp5 =
min(timeit.repeat(stmt=Способ_5, setup=setup, number = 1_000, repeat=5))
sp6 =
min(timeit.repeat(stmt=Способ_6, setup=setup, number = 1_000, repeat=5))

print(f" Способ № 1 = {sp1:.4f}")
print(f" Способ № 2 = {sp2:.4f}")
print(f" Способ № 3 = {sp3:.4f}")
print(f" Способ № 4 = {sp4:.4f}")
print(f" Способ № 5 = {sp5:.4f}")
print(f" Способ № 6 = {sp6:.4f}")

Результаты:

Способ № 1 = 0.0994

Способ № 2 = 0.2813

Способ № 3 = 0.4848

Способ № 4 = 0.1188

Способ № 5 = 0.3090

Способ № 6 = 0.2196

Как видно из результата цикл for x in a работает намного быстрее, чем все остальные, на втором месте использование генератора for x in a, и самый медленный способ это цикл с while.