Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions Урок 6. Практическое задание/task_1.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,72 @@
ВНИМАНИЕ: ЗАДАНИЯ, В КОТОРЫХ БУДУТ ГОЛЫЕ ЦИФРЫ ЗАМЕРОВ (БЕЗ АНАЛИТИКИ)
БУДУТ ПРИНИМАТЬСЯ С ОЦЕНКОЙ УДОВЛЕТВОРИТЕЛЬНО
"""
from random import randint
from memory_profiler import profile
from sys import getrefcount


@profile
def task_3_6():
a = int(input('Введите количество элементов в массиве: '))
b = [randint(0, 100) for el in range(a)]
print(b)
c = b.index(max(b))
d = b.index(min(b))
if abs(c - d) == 1:
print(f'Между максимальным элементом {max(b)} c индексом {c} и минимальным {min(b)} с индексом {d} нет чисел')
elif c < d:
print(f'Сумма элементов между минимальным {min(b)} и максимальным {max(b)} элементами: {sum(b[c:d])}')
elif c > d:
print(f'Сумма элементов между минимальным {min(b)} и максимальным {max(b)} элементами: {sum(b[d:c])}')
print(getrefcount(b))
del b


task_3_6()

"""Line # Mem usage Increment Line Contents
================================================
20 16.2 MiB 16.2 MiB @profile
21 def task_3_6():
22 16.2 MiB 0.0 MiB a = int(input('Введите количество элементов в массиве: '))
23 23.8 MiB 0.4 MiB b = [randint(0, 100) for el in range(a)]
24 23.8 MiB 0.0 MiB print(b)
25 23.8 MiB 0.0 MiB c = b.index(max(b))
26 23.8 MiB 0.0 MiB d = b.index(min(b))
27 23.8 MiB 0.0 MiB if abs(c - d) == 1:
28 print(f'Между максимальным элементом {max(b)} c индексом {c} и
минимальным {min(b)} с индексом {d} нет чисел')
29 23.8 MiB 0.0 MiB elif c < d:
30 print(f'Сумма элементов между минимальным {min(b)} и
максимальным {max(b)} элементами: {sum(b[c:d])}')
31 23.8 MiB 0.0 MiB elif c > d:
32 23.8 MiB 0.0 MiB print(f'Сумма элементов между минимальным {min(b)} и
максимальным {max(b)} элементами: {sum(b[d:c])}')

По данным измерений видно, что большой инкремент памяти бы использован при генерации списка. Но для этого пришлось
использовать range = 10**6. Для оптимизации использования памяти нужно удалить значение b после использования кода
del b.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

хорошо, вижу аналитику

Line # Mem usage Increment Line Contents
================================================
20 16.2 MiB 16.2 MiB @profile
21 def task_3_6():
22 16.2 MiB 0.0 MiB a = int(input('Введите количество элементов в массиве: '))
23 24.7 MiB 0.6 MiB b = [randint(0, 100) for el in range(a)]
24 24.7 MiB 0.0 MiB print(b)
25 24.7 MiB 0.0 MiB c = b.index(max(b))
26 24.7 MiB 0.0 MiB d = b.index(min(b))
27 24.7 MiB 0.0 MiB if abs(c - d) == 1:
28 print(f'Между максимальным элементом {max(b)} c индексом {c} и
минимальным {min(b)} с индексом {d} нет чисел')
29 24.7 MiB 0.0 MiB elif c < d:
30 print(f'Сумма элементов между минимальным {min(b)} и
максимальным {max(b)} элементами: {sum(b[c:d])}')
31 24.7 MiB 0.0 MiB elif c > d:
32 24.7 MiB 0.0 MiB print(f'Сумма элементов между минимальным {min(b)} и
максимальным {max(b)} элементами: {sum(b[d:c])}')
33 17.1 MiB 0.0 MiB del b

после добавления del память вернулась к прежнему значению, не считая погрешности профайлера.
"""

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

да

40 changes: 40 additions & 0 deletions Урок 6. Практическое задание/task_1_2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from random import randint
from memory_profiler import profile
from sys import getrefcount


@profile
def task_5():
a = [randint(-100, 100) for i in range(100000)]
print(a)
b = [a[el] for el in range(len(a)) if a[el] < 0]
c = min(b, key=abs)
d = a.index(min(b, key=abs))
print(f'Максимальный отрицательный элемент в данном массиве = {c}, его индекс {d}')
print(f'Количество ссылок на первый массив {getrefcount(a)}')
print(f'Количество ссылок на первый массив {getrefcount(b)}')


task_5()

"""
Line # Mem usage Increment Line Contents
================================================
14 16.1 MiB 16.1 MiB @profile
15 def task_5():
16 18.7 MiB 0.6 MiB a = [randint(-100, 100) for i in range(100000)]
17 18.2 MiB 0.0 MiB print(a)
18 18.6 MiB 0.1 MiB b = [a[el] for el in range(len(a)) if a[el] < 0]
19 18.6 MiB 0.0 MiB c = min(b, key=abs)
20 18.6 MiB 0.0 MiB d = a.index(min(b, key=abs))
21 18.6 MiB 0.0 MiB print(f'Максимальный отрицательный элемент в данном массиве = {c},
его индекс {d}')

По данным замера так же видно, чтобольшую часть памяти берёт на себя генератор списка, при небольших значениях массивов
трата памяти незначительна, использовав range = 10**6 показало относительно большое использвание памяти в первом
массиве, и незначительное во втором (во многом благодаря генератору списков).
Для оптимизации кода слеудет удалить ссылки на массив a и b командой del после выполнения кода.

Не понятно, почему начальные 16.1 приросли до 18.7 при инкременте 0.6. Тоже погрешность?

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

мы сравниваем 16.1 приросли до 18.7
это и есть реальный инкремент
0.6 - не отражает реальную цифру

"""