Аналіз часу виконання

Ефективне написання коду Python

Logan Thomas

Scientific Software Technical Trainer, Enthought

Навіщо вимірювати час роботи коду?

  • Дозволяє обрати оптимальний підхід до кодування
  • Швидший код == ефективніший код!
Ефективне написання коду Python

Як вимірювати час роботи коду?

  • Обчислюйте час виконання за допомогою магічної команди IPython %timeit

  • Магічні команди: розширення поверх звичайного синтаксису Python

    • Починаються з символу "%"
    • Посилання на документацію (тут)
    • Перегляньте всі магічні команди через %lsmagic
Ефективне написання коду Python

Використання %timeit

Код для вимірювання

import numpy as np

rand_nums = np.random.rand(1000)

Вимірювання з %timeit

%timeit rand_nums = np.random.rand(1000)
8.61 µs ± 69.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Ефективне написання коду Python

Вивід %timeit

alt="Вивід магічної команди timeit"

Ефективне написання коду Python

Вивід %timeit

alt="Вивід timeit з підсвіченими середнім і стандартним відхиленням"

Ефективне написання коду Python

Вивід %timeit

alt="Вивід timeit з підсвіченою кількістю запусків і циклів"

Ефективне написання коду Python

Задавання кількості запусків/циклів

Задання кількості запусків (-r) та/або циклів (-n)

# Встановити 2 запуски (-r2)
# Встановити 10 циклів (-n10)

%timeit -r2 -n10 rand_nums = np.random.rand(1000)
16.9 µs ± 5.14 µs per loop (mean ± std. dev. of 2 runs, 10 loops each)
Ефективне написання коду Python

Використання %timeit у режимі line magic

Режим line magic (%timeit)

# Один рядок коду

%timeit nums = [x for x in range(10)]
914 ns ± 7.33 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Ефективне написання коду Python

Використання %timeit у режимі cell magic

Режим cell magic (%%timeit)

# Кілька рядків коду

%%timeit
nums = []
for x in range(10):
    nums.append(x)
1.17 µs ± 3.26 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Ефективне написання коду Python

Збереження результату

Збереження виводу у змінну ()

times = %timeit -o rand_nums = np.random.rand(1000)
8.69 µs ± 91.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Ефективне написання коду Python
times.timings
[8.697893059998023e-06,
 8.651204760008113e-06,
 8.634270530001232e-06,
 8.66847825998775e-06,
 8.619398139999247e-06,
 8.902550710008654e-06,
 8.633500570012985e-06]
times.best
8.619398139999247e-06
times.worst
8.902550710008654e-06
Ефективне написання коду Python

Порівняння часу

Структури даних Python можна створювати за формальною назвою

formal_list = list()
formal_dict = dict()
formal_tuple = tuple()

Структури даних Python можна створювати літералами

literal_list = []
literal_dict = {}
literal_tuple = ()
Ефективне написання коду Python
f_time = %timeit -о formal_dict = dict()
145 ns ± 1.5 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
l_time = %timeit -о literal_dict = {}
93.3 ns ± 1.88 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
diff = (f_time.average - l_time.average) * (10**9)
print('l_time better than f_time by {} ns'.format(diff))
l_time better than f_time by 51.90819192857814 ns
Ефективне написання коду Python

Порівняння часу

%timeit formal_dict = dict()
145 ns ± 1.5 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit literal_dict = {}
93.3 ns ± 1.88 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
Ефективне написання коду Python

На старт!

Ефективне написання коду Python

Preparing Video For Download...