0% нашли этот документ полезным (0 голосов)
24 просмотров

Python 8 Black

Загружено:

antonsm0284
Авторское право
© © All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd
0% нашли этот документ полезным (0 голосов)
24 просмотров

Python 8 Black

Загружено:

antonsm0284
Авторское право
© © All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd
Вы находитесь на странице: 1/ 56

Язык программирования Python

Курс лекций для ИС-35,36


Лекция 8: Методы программирования.
Память и время в Python.
Повторим!

● Что мы изучали на прошлой лекции?


● Как назывались изученные библиотеки (всего три)?
● Для чего чаще всего используется Numpy?

● Для чего чаще всего используется Pandas?


Парадигма программирования
Паради́ гма программи́ рования — это совокупность идей и понятий, определяющих
стиль написания компьютерных программ (подход к программированию).

Парадигмы часто пересекаются между собой, совмещаются и генерируют что-то новое. Парадигмы
делятся на две большие части:
Императивная парадигма программирования
В императивной (англ. imperative — приказ) парадигме разработчик пишет для компьютера инструкции,
которым тот следует.

Инструкции могут быть следующие:

● сложи два числа;


● если а, то сделай б, а иначе сделай в;
● отправь запрос на сервер;
● открой файл;
● выведи строку.

То есть программист говорит, что нужно сделать и в каком порядке, а компьютер выполняет приказы.

Отличительная черта императивной парадигмы — понятие состояния компьютера или программы.


Состояние — это совокупность всех данных в определённый момент времени: переменных, массивов,
счётчиков и так далее.
Императивная парадигма программирования
К императивной парадигме относятся следующие виды программирования:
● структурное;
● процедурное;
● модульное;
● аспектно-ориентированное;
● объектно-ориентированное;
● визуально-ориентированное.
Также императивную парадигму программирования можно считать более
низкоуровневой, потому что программисту нужно знать, как работают
программы.
Декларативная парадигма программирования
В декларативной парадигме разработчик описывает проблему и
ожидаемый результат, но не пишет никаких инструкций.

В декларативном программировании отсутствуют переменные, состояние


и прочие понятия, которые свойственны императивной парадигме.

К декларативной парадигме относятся:

● функциональное
● и логическое программирование.
Примеры императивных и декларативных языков
Примеры декларативных языков программирования:
● SQL;
● HTML.
Императивные языки:
● C,
● C++,
● Java.
Также выделяют смешанные языки:
● JavaScript,
● C#,
● Python.
Структурное программирование
Структурное программирование — это разработка
программ с помощью представления их в виде
иерархической структуры блоков.

Эта парадигма разработана в 70-х годах XX века Э.


Дейкстрой и Н. Виртом.

Большая часть современных языков поддерживают


структурную парадигму.

Основные понятия:

— Блок

— Цикл

— Ветвление
Процедурное программирование
В результате возрастающей сложности
программного обеспечения возникла
новая методология написания программ,
которая приветствуется и по сей день —
исходная задача разбивается на меньшие
(с помощью процедур) и это происходит
до тех пор, пока решение всех конкретных
процедур не окажется тривиальным.
Основные понятия:
— Процедура
Модульное программирование
Программа описанная в стиле модульного
программирования — это набор модулей.
Что внутри, классы, императивный код или
чистые функции — не важно.

Благодаря модулям впервые в


программировании появилась серьезная
инкапсуляция — возможно использовать
какие-либо сущности внутри модуля, но не
показывать их внешнему миру.

Основные понятия:

— Модуль

— Импортирование
Аспектно-ориентированное программирование
АОП, аспектно-ориентированное
программирование — это парадигма,
направленная на повышение
модульности различных частей
приложения за счет разделения
сквозных задач. Для этого к уже
существующему коду добавляется
дополнительного поведение, без
изменений в изначальном коде. Иными
словами, мы как бы навешиваем сверху
на методы и классы дополнительную
функциональность, не внося поправки в
модифицируемый код
Объектно-ориентированное программирование

Объектно-ориентированное программирование, ООП – это одна из парадигм


разработки, подразумевающая организацию программного кода,
ориентируясь на данные и объекты, а не на функции и логические структуры.
Объектно-визуальное программирование
Язык визуального программирования — это такой язык, который позволяет
программисту создавать программы, манипулируя графическими
элементами, а не печатая текстовые команды. Известным примером
является Scratch
Функциональное программирование
Функциональное программирование - это стиль написания программы, при
котором мы позволяем себе создавать новые данные на основе имеющихся,
но запрещаем себе изменять уже существующие данные. Таким образом мы
стремимся к идеальному (недостижимому практически) положению, когда
решение нашей задачи - это одна большая математическая функция,
которой мы даём данные на вход, и она выдаёт данные на выходе.

16
Логическое программирование
Логическое программирование основывается на выводе
информации, являющейся результатом изучения
фактов.
Это упрощенная версия ФП для математиков и
лингвистов, которые обрабатывают символьную
информацию. Алгоритм решений здесь не требуется,
вместо него описывается мир задачи, объекты и их
свойства, отношения между объектами.
Логическая программа — это набор правил и
отношений, которые называются фактами. На основании
заданных фактов и правил производятся новые факты.
Процесса вычислений программа не выполняет, а
функционирует скорее как база данных: выдаёт по
запросу логический факт из уже имеющихся в базе.
Нейросетевое программирование
Программирование обучаемой (самообучаемой) сети.

Задача создать требуемую топологию и набор входных данных и


предоставить сети на них обучаться, используя один из методов
минимизации ошибок.

Интересные статьи:
https://python-scripts.com/intro-to-neural-networks

https://habr.com/ru/post/426797/

18
МЕТОДОЛОГИЯ РАЗРАБОТКИ
Какие методы разработки существуют?

● Code and fix (модель кодирования и устранения ошибок)


● Waterfall Model (каскадная модель или «водопад»)
● V-Model (много тестирования)
● Incremental Model (инкрементная модель)
● RAD Model (rapid application development model или быстрая
разработка приложений)
● Agile Model (гибкая методология разработки)
● Iterative Model (итеративная или итерационная модель)
● Spiral Model (спиральная модель)
● Extreme Programming, XP (экстремальное программирование)
● Prototype Model (прототипная модель)
Code and fix: Модель кодирования и устранения ошибок
Совершенно простая модель, характерная для студентов ВУЗов. Именно по
этой модели большинство студентов разрабатывают, ну скажем
лабораторные работы.

Данная модель имеет следующий алгоритм:

● Постановка задачи
● Выполнение
● Проверка результата

При необходимости переход к первому пункту


Waterfall Model
V-Model
Incremental Model
RAD Model
Agile Model
Spiral Model
Extreme Programming, XP
ЧАСТЫЕ ОШИБКИ: КТО ВИНОВАТ?

一 Типы данных, не явное преобразование


一 Имена констант, переменных, функций
一 Имена файлов
一 Структура программы
一 Кодировки
一 Комментарии в коде, docstring
一 Работа с документацией
И ЧТО ДЕЛАТЬ?

一 Как сформулировать свой 一 Хранение информации


вопрос 一 Рефакторинг кода
一 Как описывать проблему 一 PEP 8
другим разработчикам 一 Масштабирование своих
一 Как передавать свой код навыков :)
一 Системы контроля версий
一 Отладка кода
一 Локализация проблемы
一 Память и время
Память и ее использование
https://habr.com/ru/companies/domclick/articles/530804/

https://pylot.me/article/48-kak-python-visvobozhdaet-pamyat/?ysclid=lw6mtroaxf
919536984

https://dzen.ru/a/XKSi5lx_OgC0XQiL

https://tproger.ru/articles/raspredelenie-pamjati-v-python-skolko-i-v-kakih-sluchaj
ah-zanimajut-tipy-dannyh
Механизм памяти в Python*
При запуске Python-программы создается новый процесс, в рамках которого
операционная система выделяет пул ресурсов, включая виртуальное
адресное пространство. В эту память загружается интерпретатор Python
вместе со всеми необходимыми ему для работы данными, включая код
вашей программы.
Оставшаяся свободная виртуальная память может использоваться для
хранения информации об объектах Python’а. Для управления этой памятью в
CPython используется специальный механизм, который называется
аллокатор. Он используется каждый раз, когда вам нужно создать новый
объект.
*Здесь и далее рассматривается работа памяти CPython
Механизм памяти в Python
Аллокатор состоит из частей трёх видов:

Арена — большой непрерывный кусок


памяти (обычно 256 килобайт), содержит
несколько страниц виртуальной памяти
операционной системы.

Пул — одна страница виртуальной памяти


(обычно 4 килобайта).

Блок — маленький кусочек памяти,


используемый для хранения одного
объекта.

Подробно:
https://habr.com/ru/companies/ruvds/articles/4
41568/
Выделение памяти
Напрямую из кода память не выделяется. Вся работа по выделению памяти перекладывается на
менеджеров памяти. Есть один общий менеджер «верхнего» уровня, который отвечает за
выделение большого блока из выделенной программе памяти — «арена». Занимает 256Кб.

Далее арена делится на «пулы» по 4Кб. Каждый пул может содержать в себе только блоки заранее
определенного для этого пула размера — от 8 байт до 512 байт. Арена может содержать в себе
пулы разных размеров, а вот блоки в одном пуле всегда одного размера. На уровне блоков
работают менеджеры памяти каждого конкретного типа данных.

Когда менеджер определенного типа запрашивает память для объекта, он заранее знает размер и
может сразу обратиться к пулу с нужным размером блоков, разместив объект в первом свободном
блоке. Если же свободных блоков нет или же пулов нужного размера нет, верхний менеджер
выдает новый пул из наиболее заполненной арены. Если и все арены заняты, запрашивается
новая арена.

Интересно, что частично вернуть выделенную под арену память нельзя, пока в ней есть хоть один
непустой пул, в котором есть хоть один непустой блок. Как блоки становятся пустыми, мы обсудим
в следующем разделе.
Освобождение памяти
В Python нет необходимости в ручной очистке памяти. Если объект
больше не используется, все это перекладывается на сам
интерпретатор и два механизма: счетчик ссылок и сборщик мусора.

Когда переменной присваивается значение, на сначала создается


объект в подходящем свободном блоке (см предыдущий слайд) и потом
уже в переменную кладется ссылка на этот объект
Счетчик ссылок
Каждый созданный объект имеет специальное
поле — счетчик ссылок. Он хранит в себе
количество ссылающихся на него объектов.
Увеличивает свое значение, например, когда
используется операция присваивания, или
когда объект становится частью списка. При
удалении переменной или же при
использовании del счетчик ссылок
уменьшается на 1.
Например, при завершении работы функции,
где эта переменная была объявлена.
Сборщик мусора
Механизм очистки памяти — это сборщик мусора (garbage collector), основанный на идее
поколений.
Работает он следующим образом: GC отслеживает объекты (объекты-контейнеры, которые
могут содержать ссылки на другие объекты) и смотрит, доступны ли они из основного кода на
Python. Если нет, то сборщик их удаляет. Если да — оставляет.
В отличие от счетчика ссылок, механизм сборки мусора не работает постоянно. Он запускается
от случая к случаю на основе эвристик. GC разделяет объекты на три поколения. Каждый
новый объект начинает свой путь с первого поколения. Если объект переживает раунд сборки
мусора, он переходит к более старому поколению. В младших поколениях сборка происходит
чаще, чем в старших. Эта практика является стандартной для такого рода сборщиков мусора и
снижает частоту и объем очищаемых данных. Идея простая: чем дольше живет объект, тем с
большей вероятностью он проживет еще. То есть новые объекты удаляются гораздо чаще, чем
те, которые уже просуществовали достаточно долго.
Сборщик мусора
Сканирование первого поколения
начинается, когда количество
созданных объектов контейнерного
типа превышает количество
удаленных на заданный порог.
Например, сканирование второго
поколения начнется, когда
количество сканирований первого
поколения превысит заданный порог.
По умолчанию, пороги срабатывания
— это 700, 10 и 10, соответственно.
Метод sys.getsizeof из библиотеки sys
Функция принимает объект (и необязательный параметр по умолчанию),
вызывает метод sizeof() объекта и возвращает результат.

Для целых чисел или для байтовых массивов будет выдан их реальный
размер в байтах. А для контейнеров, вроде списков, будет показан лишь
размер самого контейнера, а не его содержимого.
Метод sys.getsizeof из библиотеки sys
Каждый раз, когда мы пересекаем пороговый
уровень, к размеру переменной добавляется 4
байта. То же самое происходит и с обычными
строками. Каждый раз, когда в строку добавляют
один символ — её размер увеличивается на 1
байт. А вот в случае со списками этот механизм
уже не работает — sys.getsizeof не «обходит»
структуру данных. Эта функция лишь возвращает
размер родительского объекта. В данном случае
— объекта типа list.
Управление памятью, еще инструменты
Встроенные инструменты профилирования Python:
cProfile:
Модуль cProfile выдает подробные отчеты, включая количество вызовов
каждой функции и время, проведенное в каждой функции. Эта информация
очень важна для выявления узких мест и «горячих точек» в вашем коде.
timeit:
Еще один встроенный инструмент Python для измерения времени
выполнения. Он проще, чем cProfile, timeit временно отключает сборщик
мусора, что может предотвратить искажение времени фоновыми
процессами.
Управление памятью, еще инструменты
Внешние инструменты профилирования:

Py-Spy: способен генерировать интерактивные графики пламени, которые обеспечивают визуальное


представление относительного времени, затраченного на каждую функцию.

line_profiler: line_profiler в отличие от cProfile, который предоставляет статистику на уровне функций,


line_profiler может предоставить гораздо более подробные данные. Это бывает чрезвычайно полезно для
выявления конкретных строк кода, которые являются потенциальными узкими местами в
производительности.

memory_profiler: Как следует из названия, memory_profiler — это инструмент для профилирования


использования памяти в программах на Python. Он может предоставлять построчные отчеты о потреблении
памяти, что может оказаться бесценным при попытке уменьшить объем памяти в ваших программах на
Python.

Yappi: (Yet Another Python Profiler) — это профилировщик процессора и потоков для Python. Его
уникальность заключается в возможности профилировать время выполнения отдельных потоков, что может
быть особенно полезно для многопоточных приложений Python.
Как измерить время выполнения кода
Модуль datetime
С помощью такого способа можно
измерить время выполнения кода в
формате часы:минуты:секунды:
микросекунды.
Модуль time
time.time () поможет измерить время работы в секундах.

time.perf_counter () также можно использовать для измерения времени в секундах, но таймер не будет
зависеть от системных часов.

time.perf_counter_ns () вернёт значение в наносекундах.

time.monotonic () подходит для больших программ, поскольку эта функция не зависит от корректировки
времени системы. Функция использует отдельный таймер, как и time.perf_counter (), но имеет более низкое
разрешение. С помощью time.monotonic_ns () можно получить результат в наносекундах.

time.process_time () поможет получить сумму системного и пользовательского процессорного времени в


секундах, не включая время сна. Если процесс выполнения блокируется функцией time.sleep () или
приостанавливается операционной системой, это время не включается в отчётное.

time.thread_time () сообщит время выполнения текущего потока, а не процесса. Если в коде есть функция
time.sleep (), время её выполнения не будет включено.
Python за 5 минут :)
Какие типы данных?
Какой тип данных выгоднее использовать для хранения
последовательности чего-либо?
Какие операторы цикла есть?
Как определить функцию?
Как подключить библиотеку?
Для чего нужны библиотеки?
Как работать с файлами?
Как работать с БД?
Вопросы?

Вам также может понравиться