diff --git "a/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" "b/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" index 0bbcc43f..08f25f15 100644 --- "a/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" +++ "b/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" @@ -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. + + 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 память вернулась к прежнему значению, не считая погрешности профайлера. + """ \ No newline at end of file diff --git "a/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1_2.py" "b/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1_2.py" new file mode 100644 index 00000000..342d72f3 --- /dev/null +++ "b/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1_2.py" @@ -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. Тоже погрешность? + +""" \ No newline at end of file