За что я люблю python или почему его можно выбрать в качестве основного инструмента разработчика 1. Быстрая разработка. Самая сильная сторона Python — обширная стандартная библиотека и огромное число сторонних модулей на любой случай из жизни. Их применение экономит кучу времени.
2. Простая поддержка кода. Синтаксический сахар приводит к немногословным программам. Меньше кода — меньше мест для ошибок.
3. Возможность точечного ускорения кода. Изначально невысокую скорость работы можно починить разными хаками. Обычно в программе тормозит "бутылочное горлышко" . Это не вся программа, а только небольшая её часть. Зачастую профилирование позволяет найти и устранить это "бутылочное горлышко" путём переписывания кода на правильный. Если переписывание не помогло, можно использовать pypy или написать модуль на С/С++.
Конечно, нельзя забывать о низком пороге входа, развитом сообществе и кроссплатформенности. А ещё ИИ хорошо пишет на питоне, ибо примеров кода через край. Безусловно, есть и минусы:
Низкий порог входа плюс популярность всякий курсов привели к переизбытку джунов. Начинающему, говорят, найти работу сложно.
Отсутствие честных private полей не очень удобно, хотя привыкаешь. Понятное дело, что по особенностям куча нюансов, но они есть в каждом языке.
Текущие неудобства с пакетным менеджером. Выбор pip, poetry, uv — хотелось бы всем на чём-то одном остановиться.
За что вы любите питон? А что вас в нём бесит?
Приглашаю вас посмотреть мой часовой стрим по созданию небольшого проекта для начинающих разработчиков. Идея проста — прочитать в csv-файле ФИО и login и проверить существование этого login на gitlab. Но тут vim, проект на gitlab, консольный git, исключения, google docstring, правильная структура проекта и тесты — всё слилось в едином экстазе.
Многие слышали про RLHF, который стал причиной успеха ChatGPT. Этот подход учит модели вести себя так, как мы хотели бы: этим он отличается от претрена, который дает только базовые способности к естественному языку.
В основе метода лежит reinforcement learning алгоритм Proximal Policy Optimization. Сначала мы создаем датасет из пар ответов, отранжированных человеком, и обучаем отдельную модель наград предсказывать, насколько ответ будет подходящим к вопросу. Это позволяет использовать модель для понимания, насколько людям понравятся неразмеченные ответы.
Дальше мы используем обученную модель, чтобы оценивать ответы нашей LLM и обучать ее максимизировать вероятность сгенерировать текст, который получит большую награду — то есть, быть ближе к “хорошему” ответу.
При использовании метода LLM сильно деградирует, потому что для максимизации вероятности успеха жертвует другими способностями. Для сохранения начальных качеств модели мы ставим ограничение (Kullback-Leibler divergence) на вид распределения вероятностей получить различные токены.
Плюсы метода:
Достаточно эффективен, в том числе для очень больших моделей. На нем работают модели из топа арены.
В зависимости от требований, мы можем обучить модель под любые качества и быть уверенными, что она не будет слишком сильно деградировать по другим способностям.
Минусы:
RL достаточно сложно настраивать и контролировать, а еще она довольно быстро оверфитится.
Так как фидбэк от людей очень дорогой, нужно обучить дополнительную модель наград для ранжирования ответов.
Нужно держать в памяти сразу несколько больших моделей: саму модель, ее начальную версию, ревард-модель.
print('\n'.join
([''.join
([('Name'[(x-y)%4 ]
if((x*0.05)**2+(y*0.1)**2-1)
**3-(x*0.05)**2*(y*0.1)
**3<=0 else ' ')
for x in range(-30,30)])
for y in range(15,-15,-1)]))
Замените Name на название\имя, а число в конце этой же строки — на количество букв в этом слове;
Сегодня день особенный — 14 февраля, нужно уделить время своим любимым и близким (просто автоапдейт девушке сегодня не прокатит!) и поздравить их по-особенному.
Как вы уже меня знаете по ряду практических гайдов с ИИ — я Гриша, главный по спецпроектам в AllSee!
Поэтому без долгих прелюдий — держите от меня подарок всему сообществу — Бот, который создаст персональную валентинку для ваших любимых!
Вы можете выбрать персонажа, прислать боту ваши пожелания и имя человека, а он на основе YandexGPT сделает персональную видео-валентинку.
P.s. а всех гиков и захабренных сверх прочего поздравляю с Днем компьютерщика (праздник начали отмечать еще в 40-х годах XX века, также отмечается 14 февраля, спасибо, подсказали зумеру в комментах)!
Сегодня мы выпускаем функционал расширенных алертов.
Теперь каждый наш пользователь сможет получать уведомления в специальный бот, если:
Проект ушел в ошибку.
Произошло превышение ОЗУ или ЦПУ выше заданного порога
Сработала Liveness или Readiness проба.
Произошла ошибка сборки или запуска проекта.
Встретилась заданная фраза в логе.
Amvera Cloud — это облако для простого деплоя приложений через git push. Встроенный CI/CD, бэкапы и мониторинг позволяют развернуть проект тремя командами в IDE и не думать о настойке инфраструктуры. Amvera проще, чем использование VPS или Kubernetes-кластера.
База для изучения одного из популярнейших языков программирования Python. С новыми знаниями вы сможете вкатиться в ИИ, веб-разработку, создание приложений и даже в геймдев.
Заранее создаваемые объекты - целые числа в Питоне
И снова здравствуйте! Здесь мы проверяем "руками" разные штуки в Питоне.
Наверняка все что-то слышали о том, что часть объектов - целых чисел в Питоне заводится заранее, чтобы сэкономить на создании объектов. В Питоне каждая сущность, даже такая как целые числа - это полноценный объект со всеми положенными объекту прибамбасами. Создавать полноценные объекты - дорого. Поэтому в Питоне, да и в других языках, насколько я помню, кажется в Java, например, часть целых чисел, которые считаются часто используемыми, создаётся заранее и потом используется всё время жизни программы. Т.е. когда вы используете какое-то большое целое число, например, n = 10_000 , то под такое число создаётся новый объект каждый раз, а если используете маленькое, например, n = 10, то новый объект не создаётся, а делается ссылка на один и тот же, заранее созданный объект.
Но давайте сами проверим: действительно ли есть такие числа и каков их диапазон. Будем проделывать с числом простейшие манипуляции - сначала увеличивать на 1, потом уменьшать на 1, чтобы получилось тоже самое число. И потом проверим, поменялся ли id (адрес в памяти) у этого числа. Конечно, тут многое будет зависеть от конкретной версии интерпретатора. Какой-то интерпретатор и код k = n - 1 + 1 не будет оптимизировать, а какой-то и в приведённом ниже коде догадается, что все операции можно сделать как одну операцию, посокращает все добавления-вычитания и мы ничего не сможем определить. И тогда нас спасёт только какой-нибудь eval с вычислениями в виде строки. Но обычно интерпретаторы Питона не настолько хитрые и приведённый ниже код вполне работает в Google Colab.
def check_if_int_cached(n):
k = n + 1
k -= 1
return id(k) == id(n)
checks = [(i, check_if_int_cached(i)) for i in range(-10000, 10000)]
for (x, a), (y, b) in zip(checks, checks[1:]):
if a != b:
print((x, y)[b])
В этом коде мы:
Проверяем, сохраняется ли idу числа после некоторых математических манипуляций, которые в итоге дают тоже самое число
Создаём последовательность из чисел диапазона [-10000, 9999] и результатов нашей проверки [(число, результат_проверки), ...]
Сцепляем попарно текущий и следующий элемент нашей последовательности, чтобы легче было проверять смену результата проверки, т.е. найти границу диапазона, где проверка даёт уже другой результат
Если результат поменялся - выводим либо текущий элемент, либо следующий, пользуясь тем трюком питона, что True - это 1. а False - это 0, и таким образом можно легко выбрать из двух чисел либо первое либо второе не через тернарный оператор, а через индексацию [num1, num2][условие]
Запустим наш код. Вывод:
-5
256
Итак, мы определили, что, действительно, целые числа в диапазоне [-5, 256] заранее создаются Питоном и какие бы ни были вычисления в программе, если в их результате получается число из этого диапазона, то под него не создаётся новый объект, а переиспользуется старый.
Давайте ещё проверим - а действительно ли эта оптимизация Питона даёт какой-то выигрыш. Попробуем создавать список из чисел диапазонов [0, 200] и [1000, 1200] и проделаем это миллион раз для солидности стабильности результата.
import time
n = 1_000_000
k = (0, 1000)
m = 200
for i in k:
t1 = time.perf_counter()
for _ in range(n):
lst = list(range(i, i+m))
t2 = time.perf_counter()
print(t2-t1)
1.732138877000125
3.547805026000333
Выигрыш по времени получился практически ровно в 2 раза! Но это если ничего не делать, а только создавать список из объектов-чисел. Если там будут ещё какие-то действия и вычисления, возможно, выигрыш будет вообще не заметен.
В предыдущем посте я писал о встроенной оптимизации добавления символов в строку в Питоне. Далее будут и другие посты об интересных мелочах в Питоне, которые быстро и просто могут быть проверены своими руками (за что мне и нравится Питон) . Спасибо за чтение.
Увеличиваем точность БПФ. Изобретаем алгоритм для Гитарного Тюнера и оценки точности пения нот вокалистами. Это анонс статьи в разработке. Подписывайтесь на мой профиль на Хабре, чтобы не пропустить статью. Или присоединяйтесь к моей "телеге". Кратко: точности и быстродействия классического БПФ не хватает для точной и быстрой оценки частоты сигнала. Ищем и изучаем другие алгоритмы. Да, я знаю много китайских маленьких приборчиков и прищепок на гитару с весьма точной настройкой, но интересно разобраться как это достигается. Напишите в комментариях какие более точные алгоритмы определения частоты сигнала вы знаете? (я уже нашел несколько, сейчас тестирую, смотрите изображение ниже) На графиках амплитудный спектр суммы 7 синусоид с близкими частотами, интервал наблюдения 0.1 секунды, частота дискретизации 22050 Гц, как видите классический БПФ ошибается и даже не все синусы видит, а альтернатива дает меньшую ошибку и все синусы увидела. Вертикальные красные линии это реально находящиеся в тестовом сигнале синусоиды. Их частоты написаны над верхней границей графиков.
Наш backend developer Дмитрий делится Open Source-проектом, который поможет разработчикам Telegram Mini Apps (TMA) упростить валидацию Init Data — проверку, что HTTP-запрос действительно был отправлен из приложения в Telegram.
Дмитрий реализовал Python-пакет, в котором имплементировал алгоритмы, позволяющие проверять подлинность данных, передаваемых из Mini Apps. С ним можно легко реализовать механизм авторизации/аутентификации для Backend-части приложения.
Также у проекта есть документация, в которой описывается применение этой библиотеки с популярными веб-фреймворками: Django, FastAPI.
Когда мы начинали разрабатывать TMA, то столкнулись с недостатком информации, кейсов, спросить или подсмотреть было не у кого – не так много компаний, которые занимаются созданием мини эппов. Сегодня же мы успешно реализовали несколько Telegram Mini Apps, накопили ценный опыт и готовы делиться своими Open Source-проектами с сообществом разработчиков и вкладываться в развитие технологии. Подписывайтесь на наш телеграм-канал!
Если у вас есть идея Telegram Mini App, то Doubletapp поможет ее воплотить, подробнее о наших кейсах – на сайте.
Он не смог решить задачу и был отчислен из вуза. Аппетита нет, шаверма остывает. А ведь нужно было просто написать программу, которая построит симметричную матрицу размерности NxN (1 < N <= 100).
Может, у вас получится помочь Алексею решить задачу? Тогда переходите в Академию Selectel.
По итогам жарких обсуждений и критики по поводу медленного кода и плохого fps в тесте вывода на экран графика sin()+noise для Matplolib были внесены усовершенствования и привлечен ИИ для полировки. Исходная статья и код https://habr.com/ru/articles/878002/
Отказ от медленного вывода текста, применение FuncAnimation вместо простого цикла, применение мэджик команды для подключения PyQT backend. FPS поднялся с 12 до 35. Подробности читайте в исходной статье https://habr.com/ru/articles/878002/
Оригинальная идея второго графика позволила отказаться от медленного вывода текста
Как продолжить изучение Python? Работа с БД, парсинг и идеи для пет‑проектов
В Академии Selectel вышел новый бесплатный курс по Python. Не рассказываем про основы — наоборот, помогаем сделать первые шаги в мире реального программирования.
После прохождения курса вы научитесь:
работать с базами данных и брокерами сообщений,
создавать приложения с графическим интерфейсом,
автоматизировать получение данных.
На вдумчивое ознакомление со всеми материалами уйдет около четырех часов.
Написана статья о тестировании (и сравнении FPS) на скорость рисования 2D графиков на python популярных и относительно малоизвестных графических пакетов 2D и 3D (Mayavi 3D, PyVista, Matplotlib, PyQTGraph, Plotly, PyGame, Arcade, pyOpenGL, VisPy, Bokeh) Возникли некоторые технические проблемы и срок публикации пока не ясен (надеюсь, на следующей неделе). Поэтому, заинтересовавшиеся коллеги, прошу подписаться на мой профиль на хабре, чтобы не пропустить публикацию этой статьи. В статье будут видео с отрисовкой в реальном времени 2D графиков и будут измерены FPS. Специально использовался слабенький мини ПК без дискретки. Тем не мене FPS достигал в некоторых случаях 100. Пример видео ниже:
Встроенная оптимизация добавления символов в строку.
Люблю делать мини-эксперименты на Питоне. Попробую оформлять их постами, посмотрю, как пойдёт.
Суть проблемы.
Недавно опять всплыл в обсуждении тот неочевидный факт, что современный Питон оптимизирует добавление символов в строку и не всегда создаёт новые строки при этом. Хотя на собеседованиях мы и говорим, что строки в Питоне иммутабельны, и если мы хотим поменять строку, то Питон нам создаёт новую строку, а старую строку мы изменить не можем... Но при этом существует оптимизация, противоречащая этому очевидному знанию.
В общем, давайте проверим, сохраняется ли строка на том же самом месте памяти. Это мы проверим по id объекта. Сохранился id - это тот же объект (хотя и, возможно, изменённый) в том же месте памяти. Поменялся id - это уже другой объект в другом месте, Питон потратил ресурсы на то, чтобы скопировать исходный объект в новое место.
def test_str():
string = ''
old_id = id(string)
print(0, 0, old_id)
old_i = 0
for i in range(1, 20000):
string += '-'
new_id = id(string)
if new_id != old_id:
print(i, i - old_i, new_id)
old_i = i
old_id = new_id
test_str()
Запустим (часть строк я сократил для наглядности):
Первое прибавление. Питон честно выделяет новую строку.
Второе прибавление. Питон кажется что-то подозревает и выделяет сразу место под следующие прибавления - по 16 ячеек (но в первый раз чуть меньше).
Прибавление 464. Питон почему-то вдруг обратно переключается на копирование строки каждый раз.
Прибавление 1016 (тут цифры разные при разных запусках). Питон вдруг вспоминает про оптимизацию и начинает выделять под строку большие куски памяти, довольно неравномерные. Возможно, он выделяет просто те сплошные куски, которые у него есть в куче и поэтому такое отсутствие системы? Тут уже нужно будет смотреть исходники.
В целом картина получается интересная. Кстати, Питон умный и если заменить код на такой, то ничего не изменится, оптимизация сохранится:
string = string + '-'
Оптимизация пропадёт только если сохранять результат в другую переменную.
Почему это важно.
Если бы не было этой оптимизации, то при каждом добавлении символа или строки в нашу строку происходило бы копирование старой строки в новое место, где достаточно памяти под новую строку. Такой процесс имел бы асимптотику O(n2) при добавлении n символов в строку по одному и это было бы очень долго и нерационально. Вместо этого обычно рекомендуют добавлять части строки в список и в самом конце собирать итоговую строку с помощью метода join, что-то типа ''.join(lst). Но, благодаря описываемой тут оптимизации мы видим, что такие добавления можно делать и к строке и производительность при этом должна не сильно страдать. Но конкретика будет зависеть от длины добавляемых фрагментов строки.
"А теперь - слайды!"
Люблю проверять всё "руками", благо Питон это легко и удобно позволяет. Планирую постепенно публиковать и другие эксперименты с Питоном. Спасибо за чтение.
P.S. Таблица в markdown похоже не получилась, подскажите, плиз, как поправить!
P.P.S. Пишут, что начиная с CPython 3.11 эту оптимизацию потеряли. ( Формирование строк через объединение списка вновь актуально.
C 14 января 2025 в Amvera Cloud доступны RabbitMQ и Memcached.
Для создания достаточно выбрать необходимый сервис в разделе «Преднастроенные сервисы» и заполнить название и несколько переменных.
В ближайшее время планируется релиз отдельного сервиса управления очередями.
Amvera Cloud — это облако для простого деплоя приложений через git push. Встроенный CI/CD, бэкапы и мониторинг позволяют развернуть проект тремя командами в IDE и не думать о настойке инфраструктуры. Amvera проще, чем использование VPS или Kubernetes-кластера.
Я очень радовался 14.08.2024 из‑за выхода очередного релиза Телеграм, в котором они анонсировали подписки за звезды, потому что это сильно облегчало мое взаимодействие с клиентами: они один раз подписываются и далее не имеют проблем с повторными платежами, вместо этого звезды тихонько списываются у них с счетов. В этом посте я расскажу, как прикрутил подписку в звездах к своей Telegram Mini App (TMA).
Вот как выглядит глазами клиентов списание звезд в пользу вашей аппы. Заметьте, никаких предупреждающих писем, как у Stripe, например.
При каждом снятии звезд клиент получает подобное сообщение
Свои подписки можно посмотреть у себя в профиле. Это выглядит так:
Для получения подтверждения оплаты счета вам нужно добавить в ваш webhook (allowed_updates) подписку на pre_checkout_query. После этого вы начнете получать update c данным полем и структурой.
Когда вы получаете такой апдейт, вам нужно отреагировать на него в течение 10 секунд: принимаете или отклоняете (например, если этот счет уже был оплачен и другие краевые условия).
Данная структура также позволяет вам понять, что было оплачено в рамках счета, путем чтения поля payload (которое было записано при создании счета).
На мое удивление сообщение об оплате встроено в существующий объект Message, так что не нужно дополнительно подписываться на новые источники данных. Вместо этого, мы просматриваем все message в поисках поля successful_payment или refunded_payment и записываем в статистику (для возможного возврата в том числе).
Обратите внимание! В структуре SuccessfulPayment есть параметр is_first_recurring, и я думал, что он True для первого платежа подписки и False для последующих, но! в последующих его просто нет (это допустимо, так как это необязательный параметр).
На этом все, как только вы начали получать successful_payment, вам не нужно больше делать ничего, чтобы клиент продлил подписку.
P.S. Вы всегда можете обновлять срок подписки при получении данного сообщения, читая поле subscription_expiration_date. Если successful_payment перестал приходить, то и подписка не обновится.
Ваш Дима из TG Defender, защита вашего Telegram канала от наплыва ботов на стиле.
Привет,Хабровчане ! Неожиданно решился на создание этой публикации – пусть она окажется полезной для кого-то из вас. Представьте ситуацию: рабочий день позади, включаем компьютер, запускаем музыкальное сопровождение и... прямо в кресле дивана нас уже сморит Морфей. Пробуждение же наполняет осознанием неразрешимой дилеммы – выключить ПК или переключить трек? Особенно когда репертуар оставляет желать лучшего!
Вот и приходится преодолевать себя, чтобы добраться до компьютера.
Так вот, в качестве решения этой проблемы разрабатываю приложение для Android с небольшим сервером на PC (начало только под Windows).
Основной фишкой станет регулировка яркости экранов, удаленное отключение ПК, переключение треков в плеере.
Телефонное приложение будет максимально чистым: без рекламы, подписок или дополнительных платежей.
Я – инженер(технарь), а не профессиональный программист, так что обещаю уделять больше внимания техническим моментам .
Все будет сделано в меру моих умений и возможностей. Благодарен за внимание! По мере продвижения работы буду дополнять этот пост новыми деталями.
А какого функционала не хватает вам ?
Пока все в стиле демо
Сделал ещё несколько дэмок . 2 приложения на kivymd (python3) связь с сервером http запросами ,но вес приложения уменьшить не удалось . Попробовал на flutter спасибо Гуглу ,ии и другу разработчику ,связь. с сервером с помощью протокола mqtt.
Я периодически просматриваю, рекомендации GitHub — там попадаются интересные библиотеки и люди. И вот после написания статьи Что не так с cProfile в PythonGitHub через некоторое время подкинул ссылку на репозиторий tuna: Python profile viewer.
Как заявляет автор, в своём инструменте он порешал, проблемы, которые имеются в SnakeViz (связанные с невозможностью восстановить граф вызовов). И на мой взгляд, автор tuna заблуждается и вводит остальных в заблуждение — проблемы он не решил, а скорее замел под ковер. «Решение», которое он выбрал — если мы не можем показать достоверную информацию о вызовах, то просто не будем ее показывать. «Решение» отличное. Да на небольших примерах это сработает (или, например, для ячеек в Jupyter), но как только граф вызовов разрастется и там появятся повторные вызов, ценность tuna резко уменьшится.
Внутри — четыре инструкции по веб-разработке на Django. Начинаем с создания и настройки простых проектов: блога и канбан-доски. Затем переходим к подключению автоматических бэкапов. Изучение займет не более часа.
После прохождения вы научитесь:
работать с бэкендом и API,
создавать веб-приложение по шаблону от Django,
настраивать Nginx для обработки запросов,
развертывать Django-приложение с помощью Gunicorn.
В конце статьи я уточнил, что главная подлянка этой схемы - необходимость одобрения Гуглом базового доступа вашего аккаунта, иначе вся эта затея окажется просто текстом на экране. И не скрою, на момент написания статьи, у меня этого базового доступа не было, но вся правда в том, что я его наконец-то получил!
В общем, схема, описанная мною в статье полностью работоспособна, можно использовать, но быть аккуратнее при общении с техподдержкой Гугла (мне пришлось с ней переписываться по почте, а сперва и вовсе потребовалось обратить на себя внимание в на их форуме).
Но оно того реально стоит, за 5 дней я обработал 50000 входящих ключевых слов и вытащил около 70к ключей для дальнейшей обработки.
Да, абсолютно бесплатно! Вот в эти моменты становится хорошо!!!