Одна из историй преподавания или часть 3. Как благодаря ленивому and функция работает рекурсивно
Перед нами квинтэссенция рекурсии и лени. При любом натуральном x функция рекурсивно досчитывает до нуля, который и возвращает.
1. Функция получает на вход натуральное число, например так
2. Происходит неявное преобразование целого числа 5 из
3. Функция переходит к проверке выражения после
4. Переходим к пункту 1.
4.1 В какой-то момент
5 (он же новый п. 2). Происходит неявное преобразование целого числа 0 из
6. Ленивый
7. Happy end и ответ в виде нуля при любом натуральном
def a(x):
return x and a(x - 1)
Перед нами квинтэссенция рекурсии и лени. При любом натуральном x функция рекурсивно досчитывает до нуля, который и возвращает.
1. Функция получает на вход натуральное число, например так
print(a(5))2. Происходит неявное преобразование целого числа 5 из
int в логический True.3. Функция переходит к проверке выражения после
and и вызывает сама себя. Но число передаётся на единицу меньше.4. Переходим к пункту 1.
4.1 В какой-то момент
x уменьшается до нуля. 5 (он же новый п. 2). Происходит неявное преобразование целого числа 0 из
int в логический False.6. Ленивый
if отказывается идти дальше and. Никакого нового вызова функции не происходит. Возвращается ноль.7. Happy end и ответ в виде нуля при любом натуральном
x на входе. Если конечно мы не переполняем стек вызова функций. Но это уже другая история... 😉👍5👏5❤2
Одна из историй преподавания или часть 4. Что за стек вызова функций из 1 и 3 части?
Каждый запуск функции кладёт на стек информацию о ней. Удаление информации происходит после завершения работы функции. И обычно стек почти пустой. Ведь даже в крутом выводе на печать списка уникальных элементов из введённой пользователем строки всего 6 функций максимально на стеке. 👇
С рекурсией ситуация хуже. Пример рекурсивного подсчёта суммы от 1 до n 👉 этот 👈 сломается на любом
Впрочем, ограничение можнообойти изменить в большую сторону. Достаточно задать новый лимит через встроенную в модуль
Но помните. С большим стеком приходит большая ответственность. 🕸
Каждый запуск функции кладёт на стек информацию о ней. Удаление информации происходит после завершения работы функции. И обычно стек почти пустой. Ведь даже в крутом выводе на печать списка уникальных элементов из введённой пользователем строки всего 6 функций максимально на стеке. 👇
print(list(set(map(str, input("Filter unique simbols: ")))))С рекурсией ситуация хуже. Пример рекурсивного подсчёта суммы от 1 до n 👉 этот 👈 сломается на любом
n больше ≈995. Стек не резиновый, ОЗУ не бесконечна. Стандартное ограничение в Python составляет 1000 элементов на стеке.Впрочем, ограничение можно
sys функцию.sys.setrecursionlimit(new_limit)Но помните. С большим стеком приходит большая ответственность. 🕸
👍6🔥3
Чем заняться в выходные? Может почитать одно старое, но от этого ничуть не утратившее актуальность интервью со мной. 🤓
Хотя. Оно скорее не обо мне, а о Python. Но и вы собрались в канале ради языка программирования. Так что смело click по ссылке. 💻
https://habr.com/ru/company/habr_career/blog/454182/
Комментарии можно и туда, и сюда 🔁
Хотя. Оно скорее не обо мне, а о Python. Но и вы собрались в канале ради языка программирования. Так что смело click по ссылке. 💻
https://habr.com/ru/company/habr_career/blog/454182/
Комментарии можно и туда, и сюда 🔁
🔥3👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Изначально завершить историю о рекурсии хотел рассказом о хвостовой рекурсии и крутым приёмом по её реализации в Python. Да, язык изначально её не поддерживает. Но чем больше статей по оптимизации хвостов рекурсии в Python читал, тем больше слёз от костылей, кривокода и плясок с бубном текло из моих глаз 😢
В итоге пришёл к двум выводам.
1. Гвидо шикарный программист и я полностью согласен с его нежеланием заниматься Устранением хвостовой рекурсии.
2. Если есть рекурсивное решение задачи, но оно может переполнить стек, задачу надо переписать через циклы.
Было:
Стало:
Или даже так, в Python Style:
В итоге пришёл к двум выводам.
1. Гвидо шикарный программист и я полностью согласен с его нежеланием заниматься Устранением хвостовой рекурсии.
2. Если есть рекурсивное решение задачи, но оно может переполнить стек, задачу надо переписать через циклы.
Было:
def func(n):
if n == 1:
return n
return n + func(n - 1)
Стало:
def func(n):
res = n
while n != 1:
n -= 1
res += n
return res
Или даже так, в Python Style:
def py_func(n):
return sum(range(1, n + 1))
🔥7
Если ваш код на Python активно взаимодействует с операционной системой... Или вы решили сделать простенький эмулятор терминала для прокачки навыков программирования. В любом случае обратите внимание на функцию system из модуля os.
os.system('python --version')
Быстро, просто, коротко.👍5
Простенький эмулятор терминала ver_1.0.alpha из прошлого поста
Та неловкая ситуация, когда комментарии интереснее, чем сам пост. 😊
import osUPD 12:30
print('OS terminal started')
while True:
cmd = input('>>> ')
os.system(cmd)
Та неловкая ситуация, когда комментарии интереснее, чем сам пост. 😊
Программисты живут кодом. Но иногда надо отдыхать. И я не про сон и еду, без которых никак. Прогулка, пробежка, поездка на велосипеде, поход подальше от цивилизации с ночёвкой. Дела и места без ноутбука, интернета, а иногда и без электричества.
Но что делать, если гениальная мысль пришла именно в такой момент?
Мой личный Top-3 для Android телефона Python-разработчика. 😉
PyDroid 3 лучшая из мобильных IDE, которые встречал. Она может не только код 🤓
Консоль, терминал интерпретатора, pip, отладчик,... 😍 https://play.google.com/store/apps/details?id=ru.iiec.pydroid3
CodeBoard клавиатура отлично помогает уйти от багов автозамены. А когда к ней привыкаешь, уровень восторга зашкаливает 😊 https://play.google.com/store/apps/details?id=com.gazlaws.codeboard
Pocket Git великолепно справляется с базовыми операциями. А синхронизироваться с облаком можно по возвращению из похода. 💡
https://play.google.com/store/apps/details?id=com.aor.pocketgit
Если у вас есть свои любимые телефонные программы ITшника, делитесь в комментариях. ✏
Но что делать, если гениальная мысль пришла именно в такой момент?
Мой личный Top-3 для Android телефона Python-разработчика. 😉
PyDroid 3 лучшая из мобильных IDE, которые встречал. Она может не только код 🤓
Консоль, терминал интерпретатора, pip, отладчик,... 😍 https://play.google.com/store/apps/details?id=ru.iiec.pydroid3
CodeBoard клавиатура отлично помогает уйти от багов автозамены. А когда к ней привыкаешь, уровень восторга зашкаливает 😊 https://play.google.com/store/apps/details?id=com.gazlaws.codeboard
Pocket Git великолепно справляется с базовыми операциями. А синхронизироваться с облаком можно по возвращению из похода. 💡
https://play.google.com/store/apps/details?id=com.aor.pocketgit
Если у вас есть свои любимые телефонные программы ITшника, делитесь в комментариях. ✏
👍8
В Python логический тип данных (он же класс
Есть лишь две логических константы
И так как "логика" основана на "целых", константы могут участвовать в математических выражениях.
bool) основан на целых числах, т.е. на классе int.Есть лишь две логических константы
True и False.И так как "логика" основана на "целых", константы могут участвовать в математических выражениях.
True преобразуется в единицу, а False в ноль.>>> 4 + TrueОдин из вариантов применения - получить переменную знак (
5
>>> 5 / False
ZeroDivisionError: division by zero
+1 или -1) из логической:sign = is_bool * 2 - 1Теперь можем оперировать числом или его инвертированным значением:
res = data * sign
👍6
Кстати, про истину и ложь. Все давно перестали замечать последнюю строку вывода ваших программ. Вот эту:
Как быть? Понять ипростить знать об этой особенности. И может быть вспомнить Zen Python: "Явное лучше неявного". 🤓
Process finished with exit code 0Ноль в конце говорит об успешном завершении программы. Для ОС ноль как раз является истиной. А если программа завершается с ошибкой, получаем какое-то отличное от нуля число. И это плохо, это ложь.
Как быть? Понять и
❤2👍2
Когда-то давно в одном проекте нужна была система помощи в принятии решения. Не буду вдаваться в подробности. 🤐
Но проверить работу кода решил не через тест-кейсы, а сразу на реальных данных. Взял из DB "CША" и...
Код не заработал. Спустя несколько часов в попытках найти баг составил в корне новый алгоритм и написал вторую версию кода. И снова ничего. Часы отладки, а результата нет. 😔
В чём была проблема узнал лишь на следующий день, когда сделал это:
Буква "C" оказалась латинской, а "ША" из кириллицы. 😱
Так я впервые познакомился с набором из 11 заглавных и 6 строчных букв, а именно: "А, В, С, Е, Н, К, М, О, Р, Т, Х, а, с, е, о, р, х." Внешне они одинаковы, но код для латиницы и кириллицы разный. 🤓
В тот же день была написана обёртка к коду, которая исправляет случайный ввод пользователя и приводит символы к нужной раскладке. 😎
И да, с тех пор глядя на строки зелёного кода я могу разглядеть девушку в красном платье. 💃
Но проверить работу кода решил не через тест-кейсы, а сразу на реальных данных. Взял из DB "CША" и...
Код не заработал. Спустя несколько часов в попытках найти баг составил в корне новый алгоритм и написал вторую версию кода. И снова ничего. Часы отладки, а результата нет. 😔
В чём была проблема узнал лишь на следующий день, когда сделал это:
data = "CША"
for char in data:
print(ord(char))
Буква "C" оказалась латинской, а "ША" из кириллицы. 😱
Так я впервые познакомился с набором из 11 заглавных и 6 строчных букв, а именно: "А, В, С, Е, Н, К, М, О, Р, Т, Х, а, с, е, о, р, х." Внешне они одинаковы, но код для латиницы и кириллицы разный. 🤓
В тот же день была написана обёртка к коду, которая исправляет случайный ввод пользователя и приводит символы к нужной раскладке. 😎
И да, с тех пор глядя на строки зелёного кода я могу разглядеть девушку в красном платье. 💃
❤6🔥4😁4👍3
Ура!!! 🎉 Модераторы Хабра пропустили мою статью о сравнении list() и [] https://habr.com/ru/post/671602/
Начало идеи в канале, вот тут: https://t.iss.one/CoolAndFunPython/26
Кстати, это первая статья именно от меня, а не через компанию, журналиста и т.п. 😍 Приятного чтения. И пусть такты процессора греют не только вашу комнату, но и душу. 😉
Начало идеи в канале, вот тут: https://t.iss.one/CoolAndFunPython/26
Кстати, это первая статья именно от меня, а не через компанию, журналиста и т.п. 😍 Приятного чтения. И пусть такты процессора греют не только вашу комнату, но и душу. 😉
Хабр
Кто быстрее создаёт списки в Python, list() или []
В процессе написания очередной программы задумался над тем, какой способ создания списков в Python работает быстрее. Большинство моих знакомых используют квадратные скобки. А некоторые совсем забыли о...
❤11🔥1
Кто-то скажет, что это повтор и спам. А я скажу, что внутренние алгоритмы Google тратят ≈4 дня от момента публикации статьи до её рекомендации.
С другими статьями, на которые "подписан" ситуация аналогичная. Всё дело как в огромном интернете, так и в почти 5 миллиардах его пользователей.
Если максимально упростить рекомендательный алгоритм, получим:
Поисковый робот обходит интернет раз в сутки. +1 день на поиск статьи.
Внутренняя DB формируется в удобный для рекомендаций вид. +1 день на базу.
Рекомендательная система сравнивает базу интересов пользователя с базой статей в поисках совпадений. +1 день на сравнение.
Статья появляется в списке рекомендуемых при включения браузера. В этот момент он получает готовый список от поисковика. 🤓
P.S. Как же системе удаётся рекомендовать "свежак"? Синхронизация всех этапов, конечно же. Статья, спустя несколько минут плановый обход ботом, спустя минуты работа с базами, следом успевает поиск по интересам, а тут и пользователь открыл браузер. Бинго. 👍
С другими статьями, на которые "подписан" ситуация аналогичная. Всё дело как в огромном интернете, так и в почти 5 миллиардах его пользователей.
Если максимально упростить рекомендательный алгоритм, получим:
Поисковый робот обходит интернет раз в сутки. +1 день на поиск статьи.
Внутренняя DB формируется в удобный для рекомендаций вид. +1 день на базу.
Рекомендательная система сравнивает базу интересов пользователя с базой статей в поисках совпадений. +1 день на сравнение.
Статья появляется в списке рекомендуемых при включения браузера. В этот момент он получает готовый список от поисковика. 🤓
P.S. Как же системе удаётся рекомендовать "свежак"? Синхронизация всех этапов, конечно же. Статья, спустя несколько минут плановый обход ботом, спустя минуты работа с базами, следом успевает поиск по интересам, а тут и пользователь открыл браузер. Бинго. 👍
👍6❤1
Расширим знания о "магических" файлах. 🧙♀️
Допустим у нас есть каталог
Первый уровень магии
Создаём пустой файл
и далее вызывать
Второй уровень магии
В файл
мы автоматически запустим содержимое файла «инит».
Например, файл содержит строку кода:
Добавляем в директорию
и тут же выполняется содержимое «мейна». Высшая магия позволяет уйти от импорта и от интерпретатора Python. Теперь мы работаем с питоновским каталогом непосредственно из нашей ОС.
Например «мейн» содержит код:
Допустим у нас есть каталог
project с файлами begin.py, work.py и другими. Большинство Python разработчиков знают, что добавление пустого файла __init__.py в директорию проекта превращает её в питоновский пакет.Первый уровень магии
Создаём пустой файл
__init__.py Теперь мы можем написать в коде:import project и далее вызывать
project.begin или project.work.Второй уровень магии
В файл
__init__.py помещаем нужный нам код. При импорте директории:import project мы автоматически запустим содержимое файла «инит».
Например, файл содержит строку кода:
print("Hello from init")
После импорта в другом файле с расширением py или в интерпретаторе, мы увидим вывод в консоли: Hello from initВысший уровень магии
Добавляем в директорию
project файл __main__.py Теперь Python может запускать project как исполняемый файл. Пишем в консоли операционной системы(!):python project и тут же выполняется содержимое «мейна». Высшая магия позволяет уйти от импорта и от интерпретатора Python. Теперь мы работаем с питоновским каталогом непосредственно из нашей ОС.
Например «мейн» содержит код:
print(f"Hello from {__name__}.py")
При запуске через ОС увидим в консоли:Hello from main.pyПриём с «инит» и «мейн» позволяет автоматизировать запуск Python скриптов по расписанию, упростить процесс первичной инициализации и вообще облегчает работу разработчика. 😎
👍14❤4
Сталкивались ли вы с ситуацией, когда огромный словарь (список, JSON) невозможно нормально прочитать? Глазами, а не из-за проблем с доступом. 👀
Берём на вооружение "заикающийся принт". 👇
Двойное "P" не заикание, а сокращение. Pretty print. Красоту он даёт при выводе словарей (и не только их).
Пример 1. Словарь
Вывод:
Обратите внимание, что при выводе ключи словаря сортируются в алфавитном порядке.
Пример 2. Словарь со списком словарей
Вывод:
Берём на вооружение "заикающийся принт". 👇
from pprint import pprint
Двойное "P" не заикание, а сокращение. Pretty print. Красоту он даёт при выводе словарей (и не только их).
Пример 1. Словарь
data_dct = {"text": "one", "new_text": 22, "other_text": [1, 2, 3], "any_text": "any_text", "data_object": None}
pprint(data_dct)Вывод:
{'any_text': 'any_text',
'data_object': None,
'new_text': 22,
'other_text': [1, 2, 3],
'text': 'one'}Обратите внимание, что при выводе ключи словаря сортируются в алфавитном порядке.
Пример 2. Словарь со списком словарей
data = {"complet":[{"id":286050,"score":10,"username":"Юрий","title":"Деревья","chapter":18,"seen":True},{"id":255762,"score":5,"username":"Алексей","title":"Ветви","chapter":8,"seen":True},{"id":284531,"score":8,"username":"Алексей","title":"Листья","chapter":7,"seen":True},{"id":845560,"score":3,"username":"Юрий","title":"Корни","chapter":27,"seen":False}],"pending":[{"id":282400,"score":5,"username":"Владимир","title":"Трава","chapter":3,"seen":True},{"id":35388,"score":35,"username":"Вероника","title":"Кусты","chapter":6,"seen":False},{"id":80718,"score":7,"username":"Юрий","title":"Грибы","chapter":6,"seen":True}],"complet_count":4,"pending_count":3}
pprint(data)Вывод:
{'complet': [{'chapter': 18,
'id': 286050,
'score': 10,
'seen': True,
'title': 'Деревья',
'username': 'Юрий'},
{'chapter': 8,
'id': 255762,
'score': 5,
'seen': True,
'title': 'Ветви',
'username': 'Алексей'},
{'chapter': 7,
'id': 284531,
'score': 8,
'seen': True,
'title': 'Листья',
'username': 'Алексей'},
{'chapter': 27,
'id': 845560,
'score': 3,
'seen': False,
'title': 'Корни',
'username': 'Юрий'}],
'complet_count': 4,
'pending': [{'chapter': 3,
'id': 282400,
'score': 5,
'seen': True,
'title': 'Трава',
'username': 'Владимир'},
{'chapter': 6,
'id': 35388,
'score': 35,
'seen': False,
'title': 'Кусты',
'username': 'Вероника'},
{'chapter': 6,
'id': 80718,
'score': 7,
'seen': True,
'title': 'Грибы',
'username': 'Юрий'}],
'pending_count': 3}👍18🔥4
Python важны отступы вначале для верной интерпретации кода. Человеку, читающему код на Python важен моноширинный шрифт, чтобы верно понять код.
Несколько lifehack'ов для тех, кто любит выкладывать Python код в Телеграм.
1. Одинарный апостроф ➡️ ` ⬅️ до и после одной строки кода сделает её (строку) моноширинной.
2. Три апострофа ➡️ ``` ⬅️ строкой выше и строкой ниже текста делают его моноширинным, как код на Python с отступами.
3 = 1 + 2. Если выделить набранный вами код, можно вызвать контекстное меню и оформить его как моно. Получаем эффект двух первых пунктов.
Бонусный лайфхак. Если развернуть телефон горизонтально, длинные строки Python кода станут более читаемыми. Проверьте на прошлом посте с примерами pprint.
Несколько lifehack'ов для тех, кто любит выкладывать Python код в Телеграм.
1. Одинарный апостроф ➡️ ` ⬅️ до и после одной строки кода сделает её (строку) моноширинной.
2. Три апострофа ➡️ ``` ⬅️ строкой выше и строкой ниже текста делают его моноширинным, как код на Python с отступами.
3 = 1 + 2. Если выделить набранный вами код, можно вызвать контекстное меню и оформить его как моно. Получаем эффект двух первых пунктов.
Бонусный лайфхак. Если развернуть телефон горизонтально, длинные строки Python кода станут более читаемыми. Проверьте на прошлом посте с примерами pprint.
🔥6👍1
Случайно наткнулся на такую строчку кода у коллег в учебном примере.
О, нет! Мои глаза! Два сушёных питона в одной строке кода. 😱
Почему? Рассказываю.
1. lambda - анонимная функция языка Python. Она является синтаксическим сахаром и позволяет записать короткую функцию в одну строку без ключевого слова def и задания имени.
В примере анонимная функция вместо вызова-использования присваивается переменной. Мы задаём имя анонимной функции. Общество анонимных лямбдоведов нервно курит в сторонке. 😭
Как починить? Явным уходом от анонимности
2. Функции присваивается имя
Как починить? Добавлением символ подчеркивания после имени. (Совет не мой, а Гвидо 🤓).
sum = lambda x, y: x + yО, нет! Мои глаза! Два сушёных питона в одной строке кода. 😱
Почему? Рассказываю.
1. lambda - анонимная функция языка Python. Она является синтаксическим сахаром и позволяет записать короткую функцию в одну строку без ключевого слова def и задания имени.
В примере анонимная функция вместо вызова-использования присваивается переменной. Мы задаём имя анонимной функции. Общество анонимных лямбдоведов нервно курит в сторонке. 😭
Как починить? Явным уходом от анонимности
def sum(x, y):
return x + y2. Функции присваивается имя
sum. Точно такое же имя у встроенной функции для подсчёта суммы. Мы перезаписали функцию из buildings. А это плохая привычка. Если не позаботиться о сокрытии в пространстве имён, у коллег по коду сломаются все их вызовы sum() в вашем общем проекте.Как починить? Добавлением символ подчеркивания после имени. (Совет не мой, а Гвидо 🤓).
def sum_(x, y):
return x + y👍11😱2
Пост о программировании без единой строчки кода.
Однажды мне надо было заполнить данные по более чем тысяче изделиям за каждый из 365 дней года:
Если заполнять ячейку таблицы за секунду, за рабочий день получится:
Интересно, есть люди, которые способны весь рабочий день нажимать кнопки клавиатуры без остановки?
Получается, что работы выпало на
Пара-тройка часов программирования и табличка стала заполняться сама, считая нужные значения, с проверками и прочими нюансами заполнения.
А теперь самое крутое. В кабинет заходит начальник и видит как я гуляю с чашкой кофе. На вопрос: "Ты чего не сидишь за компом? Работай!", киваю в сторону монитора.
Видели бы вы лицо начальника в тот момент. Премию мне не дали. Но и новыми задачами не грузили. Всё же задание было не из лёгких. 😉
Были ли у вас подобные ситуации? Когда навык программирования экономил вам время и удивлял других.
Однажды мне надо было заполнить данные по более чем тысяче изделиям за каждый из 365 дней года:
1000 × 365 = 365000 записейЕсли заполнять ячейку таблицы за секунду, за рабочий день получится:
8 × 60 × 60 = 28800 записейИнтересно, есть люди, которые способны весь рабочий день нажимать кнопки клавиатуры без остановки?
Получается, что работы выпало на
365000 ÷ 28000 ≈ 13 дней ≈ 3 рабочие неделиПара-тройка часов программирования и табличка стала заполняться сама, считая нужные значения, с проверками и прочими нюансами заполнения.
А теперь самое крутое. В кабинет заходит начальник и видит как я гуляю с чашкой кофе. На вопрос: "Ты чего не сидишь за компом? Работай!", киваю в сторону монитора.
Видели бы вы лицо начальника в тот момент. Премию мне не дали. Но и новыми задачами не грузили. Всё же задание было не из лёгких. 😉
Были ли у вас подобные ситуации? Когда навык программирования экономил вам время и удивлял других.
👍7
Тернарный оператор
Возьмём простую задачу, например сохранять в список четные числа. А если число нечётное, сохранять следующее по порядку чётное.
Было
Стало
А теперь два примера использования тернарного оператора. Первый:
И второй пример:
Оба варианта дают одинаковый результат, но...
У кого какие мысли про «но»? Свои в продолжении поста завтра утром. 😉
Возьмём простую задачу, например сохранять в список четные числа. А если число нечётное, сохранять следующее по порядку чётное.
Было
[2, 3, 4, 5]Стало
[2, 4, 4, 6]А теперь два примера использования тернарного оператора. Первый:
data = []
for x in range(10):
data.append(x) if x % 2 == 0 else data.append(x + 1)
print(data)
И второй пример:
data = []
for x in range(10):
data.append(x if x % 2 == 0 else x + 1)
print(data)
Оба варианта дают одинаковый результат, но...
У кого какие мысли про «но»? Свои в продолжении поста завтра утром. 😉
🤔4👍3
Но заключается в том, что первый вариант возвращает вызов метода append с разными аргументами. Так себе идея. 😢
Во втором случае тернарный оператор возвращает одно из двух возможных значений, которое передается как аргумент в метод append
Подобная запись не только короче. Мы явно указываем цель написания строки кода - использовать append для добавления элемента. Читать такое легче и понятнее.
Что касается Python - он тоже строит более короткий маршрут реализации, а следовательно выполняет задачу быстрее. 🏃♂💨
data.append(x) if x % 2 == 0 else data.append(x + 1)Во втором случае тернарный оператор возвращает одно из двух возможных значений, которое передается как аргумент в метод append
data.append(x if x % 2 == 0 else x + 1)Подобная запись не только короче. Мы явно указываем цель написания строки кода - использовать append для добавления элемента. Читать такое легче и понятнее.
Что касается Python - он тоже строит более короткий маршрут реализации, а следовательно выполняет задачу быстрее. 🏃♂💨
🔥4
Какая разница между потоком и процессом?
На современных ПК запуск вашей любимой программы приводит к созданию процесса с одним потоком внутри. Можно представить, что процесс - дорога, а поток - количество полос на этой дороге. Обычно по однополосной дороге движется один авто - выполняется ваш код. Получается, что для более быстрого выполнения программы можно создать несколько полос-потоков с авто на каждой? 🤔 Пусть едут парраллельно. Или создать несколько дорог-процессов? Процессы ведь могут решать параллельные задачи.
Но есть одна особенность. 🤓 Представим одноядерный процессор. Он выполняет код нескольких программ одновременно, потому что очень быстро переключается между ними. Сдивнул на пару метров вперёд машину на одной дороге процессе, потом на другой, на третей и т.д. А если внутри процесса несколько потоков, то и тут каждая машина движется по очереди. Одна в движении, остальные стоят.
Если же у процессора несколько ядер, процессы на разных ядрах действительно могут выполняться одновременно. А вот потоки внутри процесса как двигались по очереди, так и остались псевдоодновременными. 😉
#многопоточность
На современных ПК запуск вашей любимой программы приводит к созданию процесса с одним потоком внутри. Можно представить, что процесс - дорога, а поток - количество полос на этой дороге. Обычно по однополосной дороге движется один авто - выполняется ваш код. Получается, что для более быстрого выполнения программы можно создать несколько полос-потоков с авто на каждой? 🤔 Пусть едут парраллельно. Или создать несколько дорог-процессов? Процессы ведь могут решать параллельные задачи.
Но есть одна особенность. 🤓 Представим одноядерный процессор. Он выполняет код нескольких программ одновременно, потому что очень быстро переключается между ними. Сдивнул на пару метров вперёд машину на одной дороге процессе, потом на другой, на третей и т.д. А если внутри процесса несколько потоков, то и тут каждая машина движется по очереди. Одна в движении, остальные стоят.
Если же у процессора несколько ядер, процессы на разных ядрах действительно могут выполняться одновременно. А вот потоки внутри процесса как двигались по очереди, так и остались псевдоодновременными. 😉
#многопоточность
👍9