Производительность различных методов преобразования
Проверены следующие методы
- Арифметика c - Сложность O (1)
- Для L oop - - сложность O (n), где n год
- Numpy - сложность O (n), где n год
- Генератор - сложность O (n), где n - год
Результаты
Тест 1: разная длина списка возрастов со случайным возрастом от 0 до 25
- Лучшая производительность с использованием арифметики c
- Для l oop и аналогичного генератора
- Numpy худшая производительность
Тест 2: Различный возраст от 0 до 2 ** 10 (хотя возраст старше 25 лет нереалистичен c для собак)
- Арифмети c лучший исполнитель в любом возрасте
- Для l oop лучше, чем генератор для возраста менее 20
- Для l oop лучше, чем для генератора старше 20
- Numpy лучше, чем для l oop и генератора старше 100 лет, но хуже других мудрый
Код
import numpy as np
from random import randint
import perfplot
def test_arithmetic(test_years):
" Arithmetic method test "
def calc_arithmetic(dog_years):
" arithmetic conversion O(1) complexity "
return young_year*dog_years if dog_years <= 2 else 2*young_year + (dog_years-2)*old_year
for years in test_years:
" Perform over the designated years "
calc_arithmetic(years)
def test_for_loop(test_years):
" For loop test runs "
def calc_for_loop(dog_years):
human_age = 0
for i in range(dog_years):
if i < 2:
human_age += young_year
else:
human_age += old_year
return human_age
for years in test_years:
" Perform over the designated years "
calc_for_loop(years)
def test_np(test_years):
" Numpy method test runs "
def calc_np(years):
" convert using numpy "
arr = np.ones(years)
arr[:2] *= young_year
arr[2:] *= old_year
return np.sum(arr)
for years in test_years:
" Perform over the designated years "
calc_np(years)
def test_generator(test_years):
def calc_list(years):
" convert using generator "
return sum(young_year if i < 2 else old_year for i in range(years))
for years in test_years:
" Perform over the designated years "
calc_list(years)
young_year = 10.5
old_year = 4
Тест 1: случайный возраст от 0 до 25, различное количество возрастов
# Time using perfplot (https://pypi.org/project/perfplot/)
perfplot.show(
setup=lambda n: [randint(0, 25) for _ in range(n)], # or simply setup=numpy.random.rand
kernels=[test_arithmetic, test_np, test_for_loop, test_generator],
labels=['arithmetic', 'numpy', 'for_loop', 'generator'],
n_range=[2 ** k for k in range(17)],
xlabel="List Length",
equality_check= None,
target_time_per_measurement=1.0
)
Выход
Test 2: Varying Age from 0 to 1024 in Years
perfplot.show(
setup=lambda n: [n], # or simply setup=numpy.random.rand
kernels=[test_arithmetic, test_np, test_for_loop, test_generator],
labels=['arithmetic', 'numpy', 'for_loop', 'generator'],
n_range=[2 ** k for k in range(10)],
xlabel="Years",
equality_check= None,
target_time_per_measurement=1.0
)
Output
введите описание изображения здесь