Python 8 Black
Python 8 Black
Парадигмы часто пересекаются между собой, совмещаются и генерируют что-то новое. Парадигмы
делятся на две большие части:
Императивная парадигма программирования
В императивной (англ. imperative — приказ) парадигме разработчик пишет для компьютера инструкции,
которым тот следует.
То есть программист говорит, что нужно сделать и в каком порядке, а компьютер выполняет приказы.
● функциональное
● и логическое программирование.
Примеры императивных и декларативных языков
Примеры декларативных языков программирования:
● SQL;
● HTML.
Императивные языки:
● C,
● C++,
● Java.
Также выделяют смешанные языки:
● JavaScript,
● C#,
● Python.
Структурное программирование
Структурное программирование — это разработка
программ с помощью представления их в виде
иерархической структуры блоков.
Основные понятия:
— Блок
— Цикл
— Ветвление
Процедурное программирование
В результате возрастающей сложности
программного обеспечения возникла
новая методология написания программ,
которая приветствуется и по сей день —
исходная задача разбивается на меньшие
(с помощью процедур) и это происходит
до тех пор, пока решение всех конкретных
процедур не окажется тривиальным.
Основные понятия:
— Процедура
Модульное программирование
Программа описанная в стиле модульного
программирования — это набор модулей.
Что внутри, классы, императивный код или
чистые функции — не важно.
Основные понятия:
— Модуль
— Импортирование
Аспектно-ориентированное программирование
АОП, аспектно-ориентированное
программирование — это парадигма,
направленная на повышение
модульности различных частей
приложения за счет разделения
сквозных задач. Для этого к уже
существующему коду добавляется
дополнительного поведение, без
изменений в изначальном коде. Иными
словами, мы как бы навешиваем сверху
на методы и классы дополнительную
функциональность, не внося поправки в
модифицируемый код
Объектно-ориентированное программирование
16
Логическое программирование
Логическое программирование основывается на выводе
информации, являющейся результатом изучения
фактов.
Это упрощенная версия ФП для математиков и
лингвистов, которые обрабатывают символьную
информацию. Алгоритм решений здесь не требуется,
вместо него описывается мир задачи, объекты и их
свойства, отношения между объектами.
Логическая программа — это набор правил и
отношений, которые называются фактами. На основании
заданных фактов и правил производятся новые факты.
Процесса вычислений программа не выполняет, а
функционирует скорее как база данных: выдаёт по
запросу логический факт из уже имеющихся в базе.
Нейросетевое программирование
Программирование обучаемой (самообучаемой) сети.
Интересные статьи:
https://python-scripts.com/intro-to-neural-networks
https://habr.com/ru/post/426797/
18
МЕТОДОЛОГИЯ РАЗРАБОТКИ
Какие методы разработки существуют?
● Постановка задачи
● Выполнение
● Проверка результата
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
Аллокатор состоит из частей трёх видов:
Подробно:
https://habr.com/ru/companies/ruvds/articles/4
41568/
Выделение памяти
Напрямую из кода память не выделяется. Вся работа по выделению памяти перекладывается на
менеджеров памяти. Есть один общий менеджер «верхнего» уровня, который отвечает за
выделение большого блока из выделенной программе памяти — «арена». Занимает 256Кб.
Далее арена делится на «пулы» по 4Кб. Каждый пул может содержать в себе только блоки заранее
определенного для этого пула размера — от 8 байт до 512 байт. Арена может содержать в себе
пулы разных размеров, а вот блоки в одном пуле всегда одного размера. На уровне блоков
работают менеджеры памяти каждого конкретного типа данных.
Когда менеджер определенного типа запрашивает память для объекта, он заранее знает размер и
может сразу обратиться к пулу с нужным размером блоков, разместив объект в первом свободном
блоке. Если же свободных блоков нет или же пулов нужного размера нет, верхний менеджер
выдает новый пул из наиболее заполненной арены. Если и все арены заняты, запрашивается
новая арена.
Интересно, что частично вернуть выделенную под арену память нельзя, пока в ней есть хоть один
непустой пул, в котором есть хоть один непустой блок. Как блоки становятся пустыми, мы обсудим
в следующем разделе.
Освобождение памяти
В Python нет необходимости в ручной очистке памяти. Если объект
больше не используется, все это перекладывается на сам
интерпретатор и два механизма: счетчик ссылок и сборщик мусора.
Для целых чисел или для байтовых массивов будет выдан их реальный
размер в байтах. А для контейнеров, вроде списков, будет показан лишь
размер самого контейнера, а не его содержимого.
Метод sys.getsizeof из библиотеки sys
Каждый раз, когда мы пересекаем пороговый
уровень, к размеру переменной добавляется 4
байта. То же самое происходит и с обычными
строками. Каждый раз, когда в строку добавляют
один символ — её размер увеличивается на 1
байт. А вот в случае со списками этот механизм
уже не работает — sys.getsizeof не «обходит»
структуру данных. Эта функция лишь возвращает
размер родительского объекта. В данном случае
— объекта типа list.
Управление памятью, еще инструменты
Встроенные инструменты профилирования Python:
cProfile:
Модуль cProfile выдает подробные отчеты, включая количество вызовов
каждой функции и время, проведенное в каждой функции. Эта информация
очень важна для выявления узких мест и «горячих точек» в вашем коде.
timeit:
Еще один встроенный инструмент Python для измерения времени
выполнения. Он проще, чем cProfile, timeit временно отключает сборщик
мусора, что может предотвратить искажение времени фоновыми
процессами.
Управление памятью, еще инструменты
Внешние инструменты профилирования:
Yappi: (Yet Another Python Profiler) — это профилировщик процессора и потоков для Python. Его
уникальность заключается в возможности профилировать время выполнения отдельных потоков, что может
быть особенно полезно для многопоточных приложений Python.
Как измерить время выполнения кода
Модуль datetime
С помощью такого способа можно
измерить время выполнения кода в
формате часы:минуты:секунды:
микросекунды.
Модуль time
time.time () поможет измерить время работы в секундах.
time.perf_counter () также можно использовать для измерения времени в секундах, но таймер не будет
зависеть от системных часов.
time.monotonic () подходит для больших программ, поскольку эта функция не зависит от корректировки
времени системы. Функция использует отдельный таймер, как и time.perf_counter (), но имеет более низкое
разрешение. С помощью time.monotonic_ns () можно получить результат в наносекундах.
time.thread_time () сообщит время выполнения текущего потока, а не процесса. Если в коде есть функция
time.sleep (), время её выполнения не будет включено.
Python за 5 минут :)
Какие типы данных?
Какой тип данных выгоднее использовать для хранения
последовательности чего-либо?
Какие операторы цикла есть?
Как определить функцию?
Как подключить библиотеку?
Для чего нужны библиотеки?
Как работать с файлами?
Как работать с БД?
Вопросы?