-
Notifications
You must be signed in to change notification settings - Fork 0
Lesson6 #6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: lesson5
Are you sure you want to change the base?
Lesson6 #6
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,157 @@ | ||
| # Подсчитать, сколько было выделено памяти под переменные в ранее разработанных программах в рамках первых трех уроков. | ||
| # Проанализировать результат и определить программы с наиболее эффективным использованием памяти. | ||
| # Для анализа возьмите любые 1-3 ваших программы. Результаты анализа вставьте в виде комментариев к коду. | ||
| # P.S. Напишите в комментариях версию Python и разрядность ОС. | ||
| # Версия python: Python 3.7.0 | ||
| # Разрядность ОС - 64 бит | ||
|
|
||
| import random | ||
| import sys | ||
|
|
||
| # Немного модифицировал функцию, которую вы написали на уроке - вместо вывода на экран она считает размер переменной | ||
| def mod_size(x, size = 0): | ||
| size += sys.getsizeof(x) | ||
| if hasattr(x, '__iter__'): | ||
| if hasattr(x, 'items'): | ||
| for key, value in x.items(): | ||
| size += sys.getsizeof(key) | ||
| size += sys.getsizeof(value) | ||
| elif not isinstance(x, str): | ||
| for item in x: | ||
| size += sys.getsizeof(item) | ||
| return size | ||
|
|
||
| # Данную функцию тоже немного переписал. Перед завершением работы она выводит суммарно сколько памяти использовали | ||
| # все переменные | ||
| def maxfreq(SIZE, RANGEMAX): | ||
| array = [] | ||
| for _ in range(SIZE): | ||
| array.append(random.randint(0, RANGEMAX)) | ||
|
|
||
| countarray = [0] * (RANGEMAX + 1) | ||
|
|
||
| for i in range(SIZE): | ||
| num = array[i] | ||
| countarray[num] += 1 | ||
|
|
||
| maxpos = 0 | ||
|
|
||
| for i in range(RANGEMAX): | ||
| if countarray[i] > maxpos: | ||
| maxpos = i | ||
| print(mod_size(maxpos)) | ||
| print(mod_size(array)) | ||
| print(mod_size(countarray)) | ||
| print(f'Summary: {mod_size(maxpos) + mod_size(array) + mod_size(countarray)}') | ||
| return maxpos | ||
|
|
||
| # Вариант #2 Сделал тоже самое и для этой функции | ||
| def teachersmaxfreq(SIZE, RANGEMAX): | ||
| array = [random.randint(0, RANGEMAX) for _ in range(SIZE)] | ||
| num = array[0] | ||
| frequency = 1 | ||
| for i in range(SIZE): | ||
| spam = 1 | ||
| for k in range(i + 1, SIZE): | ||
| if array[i] == array[k]: | ||
| spam += 1 | ||
| if spam > frequency: | ||
| frequency = spam | ||
| num = array[i] | ||
|
|
||
| print(mod_size(array)) | ||
| print(mod_size(num)) | ||
| print(mod_size(frequency)) | ||
| print(mod_size(spam)) | ||
| print(f'Summary: {mod_size(array) + mod_size(num) + mod_size(frequency) + mod_size(spam)}' ) | ||
|
|
||
| return num, frequency | ||
|
|
||
| # Вызываем функции с разными параметрами и смотрим расход памяти | ||
| #maxfreq(1000, 1000) | ||
| # 14 | ||
| # 18512 | ||
| # 17296 | ||
| # Summary: 35822 | ||
| #teachersmaxfreq(1000, 1000) | ||
| # 118516 | ||
| # 14 | ||
| # 14 | ||
| # 14 | ||
| # Summary: 18558 | ||
| #maxfreq(10000, 10000) | ||
| #14 | ||
| #183814 | ||
| #172634 | ||
| #Summary: 356462 | ||
| #teachersmaxfreq(10000, 10000) | ||
| #183816 | ||
| #14 | ||
| #14 | ||
| #14 | ||
| #Summary: 183858 | ||
|
|
||
| # Вывод - функция 1 - жертвуем памятью ради быстродействия, функция 2 - жертвуем быстродействием - экономим память | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Отлично |
||
|
|
||
| # Подсчитаем память для других двух функций (разные реализации поиска простого числа) В данном случае считал размер | ||
| # только тех переменных размер которых изменяется с изменением параметров функции | ||
| # Вариант 1 - используем решето Эратосфена. Модернизирована под подсчет памяти | ||
| def erathnum(f): | ||
| n = f * 100 | ||
| a = [0] * n | ||
| for i in range(n): | ||
| a[i] = i | ||
| a[1] = 0 | ||
| m = 2 | ||
| while m < n: | ||
| if a[m] != 0: # если он не равен нулю, то | ||
| j = m * 2 # увеличить в два раза (текущий элемент - простое число) | ||
| while j < n: | ||
| a[j] = 0 # заменить на 0 | ||
| j = j + m # перейти в позицию на m больше | ||
| m += 1 | ||
| b = [] | ||
| for i in a: | ||
| if a[i] != 0: | ||
| b.append(a[i]) | ||
| #del a | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Хорошо, что закомментировали. Даже успел подумать об ошибке при замерах удалённой переменной |
||
| print(mod_size(a)) | ||
| print(mod_size(b)) | ||
| print(f'Summary: {mod_size(a) + mod_size(b)}') | ||
| return(b[f - 1]) | ||
|
|
||
| # Вариант 2. Поиск простых чисел делением на все предыдущие найденные. Модернизирована под подсчет памяти | ||
| def findsimple(f): | ||
| simplenums = [2] | ||
| testednum = 2 | ||
| while len(simplenums) < f: | ||
| counter = 0 | ||
| testednum += 1 | ||
| for i in range(0, (len(simplenums) - 1)): | ||
| if (testednum % simplenums[i]) == 0: | ||
| counter += 1 | ||
| if counter == 0: | ||
| simplenums.append(testednum) | ||
| print(f'Summary: {mod_size(simplenums)}') | ||
| return(simplenums[f - 1]) | ||
|
|
||
| # Измеряем | ||
|
|
||
| #erathnum(1000) | ||
| # #1631380 | ||
| # #185376 | ||
| # #Summary: 1816756 | ||
| # | ||
| # #findsimple(1000) | ||
| # # Summary: 18076 | ||
|
|
||
| #erathnum(100) | ||
| #162494 | ||
| #22310 | ||
| #Summary: 184804 | ||
|
|
||
| #findsimple(100) | ||
| #Summary: 1868 | ||
|
|
||
| # В данном случае можем сделать точно такой же вывод как и в первом случае - алгоритм, экономнее расходующий память | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Отличная работа. |
||
| # требовательнее к производительности и наоборот. | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Константы решили не добавлять? )))