From 3452500a07e91d64177a6d7e921c352005ec37fb Mon Sep 17 00:00:00 2001 From: Artem Sivkov Date: Thu, 10 Jun 2021 02:01:36 +0500 Subject: [PATCH] Task_1_2 --- .../task_1.py" | 79 +++++++++++++++++++ .../task_3.py" | 34 ++++++++ 2 files changed, 113 insertions(+) create mode 100644 "\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_3.py" 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 4bfb8a82..9d263891 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" @@ -13,3 +13,82 @@ ВНИМАНИЕ: ЗАДАНИЯ, В КОТОРЫХ БУДУТ ГОЛЫЕ ЦИФРЫ ЗАМЕРОВ (БЕЗ АНАЛИТИКИ) БУДУТ ПРИНИМАТЬСЯ С ОЦЕНКОЙ УДОВЛЕТВОРИТЕЛЬНО """ + +from memory_profiler import profile + + +# Функции возвращают сумму ряда 1/n^2 для первых n элементов + +@profile() +def my_func(): + series = [1 / i ** 2 for i in range(1, 100000)] + sum = 0 + for i in range(len(series)): + sum += series[i] + return sum + + +""" +Line # Mem usage Increment Occurences Line Contents +============================================================ + 20 19.1 MiB 19.1 MiB 1 @profile() + 21 def my_func(): + 22 23.6 MiB 4.5 MiB 100002 series = [1 / i ** 2 for i in range(1, 100000)] + 23 23.6 MiB 0.0 MiB 1 sum = 0 + 24 23.6 MiB 0.0 MiB 100000 for i in range(len(series)): + 25 23.6 MiB 0.0 MiB 99999 sum += series[i] + 26 23.6 MiB 0.0 MiB 1 return sum +""" + + +@profile() +def my_func_1(): + series = [1 / i ** 2 for i in range(1, 100000)] + sum = 0 + for i in range(len(series)): + sum += series[i] + del series + return sum + + +""" +Line # Mem usage Increment Occurences Line Contents +============================================================ + 40 19.4 MiB 19.4 MiB 1 @profile() + 41 def my_func_1(): + 42 23.5 MiB 4.1 MiB 100002 series = [1/i**2 for i in range(1, 100000)] + 43 23.5 MiB 0.0 MiB 1 sum = 0 + 44 23.5 MiB 0.0 MiB 100000 for i in range(len(series)): + 45 23.5 MiB 0.0 MiB 99999 sum += series[i] + 46 19.7 MiB -3.8 MiB 1 del series + 47 19.7 MiB 0.0 MiB 1 return sum +""" + + +@profile() +def my_func_2(): + sum = 0 + for i in range(1, 100000): + sum += 1 / i ** 2 + +""" +Line # Mem usage Increment Occurences Line Contents +============================================================ + 68 20.9 MiB 20.9 MiB 1 @profile() + 69 def my_func_2(): + 70 #return sum([1 / i ** 2 for i in range(1, 100000)]) + 71 20.9 MiB 0.0 MiB 1 sum = 0 + 72 20.9 MiB 0.0 MiB 100000 for i in range(1, 100000): + 73 20.9 MiB 0.0 MiB 99999 sum += 1 / i ** 2 +""" + +my_func() +my_func_1() +my_func_2() + +""" +ВЫВОДЫ: удаление массива перед завершением функции позволило высвободить память. +Полный отказ от массива сократил код и уменьшил максимально используемый +функцией размер памяти, однако, сами элементы ряда в итоге нигде не хранятся, +что в реальных задачах может быть неудобно +""" 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_3.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_3.py" new file mode 100644 index 00000000..8deb1a65 --- /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_3.py" @@ -0,0 +1,34 @@ +""" +Задание 3 *. +Сделать профилировку для скриптов с рекурсией и сделать описание, +можно ли так профилировать и есть ли 'подводные камни' в профилировании? +Придумать как это решить! +Есть очень простое решение! +""" + +""" +Для профилирования скриптов с рекурсией необходимо создать отдельную +функцию, которая будет входной точкой, и производить замеры для нее. +Если производить замеры для самой рекурсивной функции, то они будут +производиться при каждом ее вызове +""" + +from memory_profiler import profile + + +def fibonacci(n): + if n <= 1: + return n + else: + return fibonacci(n - 1) + fibonacci(n - 2) + + +@profile() +def wrapper(n): + return fibonacci(n) + + +n = int(input("Введите номер члена последовательности: ")) +print(f"Последовательность Фибоначчи: {fibonacci(n)}") + +wrapper(n)