Как стать автором
Обновить
559.76

Python *

Высокоуровневый язык программирования

Сначала показывать
Порог рейтинга

Необычное! Исходник прототипа игры Пинг-Понг на MatPlotLib (научная графика на python) с высоким FPS .

Ранее в моей >>статье на Хабр было рассмотрено применение PyGame для построения графиков, а теперь, наоборот, делаем игру на системе построения научных графиков. В предыдущей версии при попытке вывода текста с высоким FPS возникали сильные "тормоза", В текущей версии эта проблема решена.

В коде для отрисовки всех элементов игры используются только объекты MatPlotLib: теннисные ракетки - это столбцовые диаграммы, мячик - это scatter диаграмма, само игровое поле - это объект figure из MatPlotLib, текст также выводится через встроенные в MatPlotLib функции. Для анимации используется встроенный в MatPlotLib объект Animation + update(). FPS=40 (сорок!).

P.S. желтая столбцовая диаграмма - это распределение координат по оси Y, в которых ракетка отбивает мячик. Обновляется при каждом ударе ракеткой по мячику.

Теги:
Всего голосов 5: ↑3 и ↓2+2
Комментарии1

Представлен локальный ИИ-ассистент DeepSeek Code Companion для разработчиков на базе DeepSeek R1. Для работы с ним не нужен даже API. Пишет код на уровне сеньора. Во время компиляции помогает в отладке и исправлении багов. Даёт рекомендации по архитектуре и масштабированию. На выбор есть две модели: для быстрых ответов и для более сложных задач.

Теги:
Всего голосов 2: ↑1 и ↓10
Комментарии5

Из комментариев к статье о гитарном тюнере выяснилось, что многие НЕ верят, что можно вычислять ОЧЕНЬ ТОЧНО частоту синусоидального сигнала по очень небольшому количеству отсчетов не равному степени двойки для FFT и намного точнее чем FFT на том же количестве отсчетов и том же временном интервале накопления данных. Например, ошибка определения частоты может быть 0.05 Гц при небольшом количестве отсчетов на интервале 0.1 сек (FFT дало бы ошибку в 10 Гц = 1/0.1 сек) . Однако, кажется, это возможно. Вот ссылка на мой код на Python (>>исходник) (в телеграм) Коллеги, прошу проверить код, возможно я где-то ошибся.

Actual frequency: 5.77 Hz Estimated frequency: 5.769999999999999 Hz Frequency estimation error: 8.881784197001252e-16 Hz
Actual frequency: 5.77 Hz Estimated frequency: 5.769999999999999 Hz Frequency estimation error: 8.881784197001252e-16 Hz

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии11

Создать Telegram-бота и получить за это подарок от Selectel?

Да, это возможно, если вписаться в наш интерактив. Вот что нужно сделать:

  1. Создайте бота и опубликуйте репозиторий на GitHub.

  2. Пришлите ссылку на репозиторий в Telegram-канал SelectelFeedbackBot, чтобы получить бонусные рубли для панели управления.

  3. Задеплойте бота в облаке Selectel, оплатив услуги полученными баллами.

  4. Отправьте ссылку на бота в Telegram-канал SelectelFeedbackBot.

Мы будем ждать ваших сообщений до 2 марта 2025 года, после чего подведем итоги. 10 счастливчиков получат комплект мерча Selectel: картхолдер, кружку и плюшевого Тирекса 🦖

Если готового бота у вас еще нет и вы вообще таким не занимались, то у нас в Академии Selectel есть пример для вдохновения — пошаговый гайд по созданию бота для прогноза погоды. На всякий случай есть еще инструкция, как задеплоить бота на сервер (мало ли).

Полные правила конкурса доступны по ссылке. Узнать обо всем чуть подробнее можно в нашем Telegram-канале.

Теги:
Всего голосов 8: ↑8 и ↓0+9
Комментарии0

Direct Preference Optimization

Proximal Policy Optimization работает хорошо, но необходимость собирать фидбэк, обучать на нем модель наград и тюнить дальнейший RL оказывается довольно ресурсоемкой задачей, вместо которой можно напрямую оптимизировать нашу политику (LLM) по парам предпочтений пользователей. Имея промпт и пару ответов chosen/rejected, мы можем вместо их абсолютных значений награды требовать, чтобы вероятность генерации одного была выше, чем у второго. Как и в PPO, метод имеет свойство сильно ухудшать другие качества модели, из-за чего нужно добавлять ограничивающий член в лосс, который будет сохранять общее распределение предсказаний похожим на начальную модель.

Плюсы метода:

  • Не требует обучения и хранения в памяти ревард модели, в том числе не подвержен ее собственным искажениям. Проще контролировать, чем PPO.

  • Можно попробовать использовать вместо исходной модели предполагать равномерное распределение предсказаний, чтобы ограничить затраты по памяти.

  • Есть модификации, которые используют отранжированные списки ответов для улучшения качества обучения.

Минусы метода:

  • Некоторые исследования показывают, что модель после DPO перформит еще хуже, чем до него.

  • Все еще довольно неэффективный по памяти, так как нужно хранить не только саму модель, но и ее начальное состояние, что даже с шарингом некоторых слоев оказывается затратным.

  • Все еще оверфиттится под датасет. Кроме того, мы не можем использовать многие методы расширения датасета, так как ожидаем, что все ответы сгенерированы одной и той же политикой. То есть, можем наказать модель за то, чего она не делала.

  • В отличие от более свежих методов, требует больше времени на обучение.

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

За что я люблю python или почему его можно выбрать в качестве основного инструмента разработчика
1. Быстрая разработка. Самая сильная сторона Python — обширная стандартная библиотека и огромное число сторонних модулей на любой случай из жизни. Их применение экономит кучу времени.

2. Простая поддержка кода. Синтаксический сахар приводит к немногословным программам. Меньше кода — меньше мест для ошибок.

3. Возможность точечного ускорения кода. Изначально невысокую скорость работы можно починить разными хаками. Обычно в программе тормозит "бутылочное горлышко" . Это не вся программа, а только небольшая её часть. Зачастую профилирование позволяет найти и устранить это "бутылочное горлышко" путём переписывания кода на правильный. Если переписывание не помогло, можно использовать pypy или написать модуль на С/С++.

Конечно, нельзя забывать о низком пороге входа, развитом сообществе и кроссплатформенности. А ещё ИИ хорошо пишет на питоне, ибо примеров кода через край. Безусловно, есть и минусы:

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

  2. Отсутствие честных private полей не очень удобно, хотя привыкаешь. Понятное дело, что по особенностям куча нюансов, но они есть в каждом языке.

  3. Текущие неудобства с пакетным менеджером. Выбор pip, poetry, uv — хотелось бы всем на чём-то одном остановиться.

За что вы любите питон? А что вас в нём бесит?

Приглашаю вас посмотреть мой часовой стрим по созданию небольшого проекта для начинающих разработчиков. Идея проста — прочитать в csv-файле ФИО и login и проверить существование этого login на gitlab. Но тут vim, проект на gitlab, консольный git, исключения, google docstring, правильная структура проекта и тесты — всё слилось в едином экстазе.

Теги:
Всего голосов 8: ↑6 и ↓2+4
Комментарии2

Proximal Policy Optimization

Многие слышали про RLHF, который стал причиной успеха ChatGPT. Этот подход учит модели вести себя так, как мы хотели бы: этим он отличается от претрена, который дает только базовые способности к естественному языку.

В основе метода лежит reinforcement learning алгоритм Proximal Policy Optimization. Сначала мы создаем датасет из пар ответов, отранжированных человеком, и обучаем отдельную модель наград предсказывать, насколько ответ будет подходящим к вопросу. Это позволяет использовать модель для понимания, насколько людям понравятся неразмеченные ответы.

Дальше мы используем обученную модель, чтобы оценивать ответы нашей LLM и обучать ее максимизировать вероятность сгенерировать текст, который получит большую награду — то есть, быть ближе к “хорошему” ответу.

При использовании метода LLM сильно деградирует, потому что для максимизации вероятности успеха жертвует другими способностями. Для сохранения начальных качеств модели мы ставим ограничение (Kullback-Leibler divergence) на вид распределения вероятностей получить различные токены.

Плюсы метода:

  • Достаточно эффективен, в том числе для очень больших моделей. На нем работают модели из топа арены.

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

Минусы:

  • RL достаточно сложно настраивать и контролировать, а еще она довольно быстро оверфитится.

  • Так как фидбэк от людей очень дорогой, нужно обучить дополнительную модель наград для ранжирования ответов.

  • Нужно держать в памяти сразу несколько больших моделей: саму модель, ее начальную версию, ревард-модель.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Готовим валентинку в Python:

1. Заходим сюда;

2. Копируем и вставляем код:

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 на название\имя, а число в конце этой же строки — на количество букв в этом слове;

3. Жмём Run.

Теги:
Всего голосов 6: ↑6 и ↓0+6
Комментарии3

Всех с праздником, любимые Хабрчане!

Сегодня день особенный — 14 февраля, нужно уделить время своим любимым и близким (просто автоапдейт девушке сегодня не прокатит!) и поздравить их по-особенному.

Как вы уже меня знаете по ряду практических гайдов с ИИ — я Гриша, главный по спецпроектам в AllSee!

Поэтому без долгих прелюдий — держите от меня подарок всему сообществу — Бот, который создаст персональную валентинку для ваших любимых!

Вы можете выбрать персонажа, прислать боту ваши пожелания и имя человека, а он на основе YandexGPT сделает персональную видео-валентинку.

Потестировать можно всем прямо в телеграм вот тут, но поторопитесь, ведь прошлый ИИ-дед-мороз с новогодними видео-открытками выстроил в очередь больше 200 человек, а суммарно набрал 1000 пользователей накануне Нового года.

Ну, и конечно, вот вам открытка, дорогие 💙

https://youtube.com/shorts/9WDFuHSCwW0?si=kJDr-RiwXbxAR7E2

P.s. а всех гиков и захабренных сверх прочего поздравляю с Днем компьютерщика (праздник начали отмечать еще в 40-х годах XX века, также отмечается 14 февраля, спасибо, подсказали зумеру в комментах)!

Теги:
Всего голосов 1: ↑0 и ↓1-1
Комментарии2

Расширенные алерты в Amvera Cloud

Сегодня мы выпускаем функционал расширенных алертов.

Теперь каждый наш пользователь сможет получать уведомления в специальный бот, если:

  1. Проект ушел в ошибку.

  2. Произошло превышение ОЗУ или ЦПУ выше заданного порога

  3. Сработала Liveness или Readiness проба.

  4. Произошла ошибка сборки или запуска проекта.

  5. Встретилась заданная фраза в логе.

Amvera Cloud — это облако для простого деплоя приложений через git push. Встроенный CI/CD, бэкапы и мониторинг позволяют развернуть проект тремя командами в IDE и не думать о настойке инфраструктуры. Amvera проще, чем использование VPS или Kubernetes-кластера.

Теги:
Рейтинг0
Комментарии0

База для изучения одного из популярнейших языков программирования Python. С новыми знаниями вы сможете вкатиться в ИИ, веб-разработку, создание приложений и даже в геймдев.

Курсы и задачи:

Интерактивные платформы:

Видеоуроки:

Книги:

Бонус: в Steam вышла игра Joy of Programming — Software Engineering Simulator от разработчика на Python.

Теги:
Всего голосов 4: ↑4 и ↓0+4
Комментарии1

Заранее создаваемые объекты - целые числа в Питоне

И снова здравствуйте! Здесь мы проверяем "руками" разные штуки в Питоне.

Наверняка все что-то слышали о том, что часть объектов - целых чисел в Питоне заводится заранее, чтобы сэкономить на создании объектов. В Питоне каждая сущность, даже такая как целые числа - это полноценный объект со всеми положенными объекту прибамбасами. Создавать полноценные объекты - дорого. Поэтому в Питоне, да и в других языках, насколько я помню, кажется в 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 раза! Но это если ничего не делать, а только создавать список из объектов-чисел. Если там будут ещё какие-то действия и вычисления, возможно, выигрыш будет вообще не заметен.

В предыдущем посте я писал о встроенной оптимизации добавления символов в строку в Питоне. Далее будут и другие посты об интересных мелочах в Питоне, которые быстро и просто могут быть проверены своими руками (за что мне и нравится Питон) . Спасибо за чтение.

Теги:
Всего голосов 5: ↑5 и ↓0+5
Комментарии3

Увеличиваем точность БПФ. Изобретаем алгоритм для Гитарного Тюнера и оценки точности пения нот вокалистами. Это анонс статьи в разработке. Подписывайтесь на мой профиль на Хабре, чтобы не пропустить статью. Или присоединяйтесь к моей "телеге". Кратко: точности и быстродействия классического БПФ не хватает для точной и быстрой оценки частоты сигнала. Ищем и изучаем другие алгоритмы. Да, я знаю много китайских маленьких приборчиков и прищепок на гитару с весьма точной настройкой, но интересно разобраться как это достигается. Напишите в комментариях какие более точные алгоритмы определения частоты сигнала вы знаете? (я уже нашел несколько, сейчас тестирую, смотрите изображение ниже) На графиках амплитудный спектр суммы 7 синусоид с близкими частотами, интервал наблюдения 0.1 секунды, частота дискретизации 22050 Гц, как видите классический БПФ ошибается и даже не все синусы видит, а альтернатива дает меньшую ошибку и все синусы увидела. Вертикальные красные линии это реально находящиеся в тестовом сигнале синусоиды. Их частоты написаны над верхней границей графиков.

Теги:
Всего голосов 2: ↑2 и ↓0+3
Комментарии38

Ближайшие события

Наш backend developer Дмитрий делится Open Source-проектом, который поможет разработчикам Telegram Mini Apps (TMA) упростить валидацию Init Data — проверку, что HTTP-запрос действительно был отправлен из приложения в Telegram.

Дмитрий реализовал Python-пакет, в котором имплементировал алгоритмы, позволяющие проверять подлинность данных, передаваемых из Mini Apps. С ним можно легко реализовать механизм авторизации/аутентификации для Backend-части приложения.

👉 Забирайте репозиторий: https://github.com/swimmwatch/telegram-webapp-auth

Также у проекта есть документация, в которой описывается применение этой библиотеки с популярными веб-фреймворками: Django, FastAPI.

Когда мы начинали разрабатывать TMA, то столкнулись с недостатком информации, кейсов, спросить или подсмотреть было не у кого – не так много компаний, которые занимаются созданием мини эппов. Сегодня же мы успешно реализовали несколько Telegram Mini Apps, накопили ценный опыт и готовы делиться своими Open Source-проектами с сообществом разработчиков и вкладываться в развитие технологии. Подписывайтесь на наш телеграм-канал!

Если у вас есть идея Telegram Mini App, то Doubletapp поможет ее воплотить, подробнее о наших кейсах – на сайте.

Теги:
Всего голосов 4: ↑4 и ↓0+4
Комментарии0

Слева сидит Лёша

Он не смог решить задачу и был отчислен из вуза. Аппетита нет, шаверма остывает. А ведь нужно было просто написать программу, которая построит симметричную матрицу размерности NxN (1 < N <= 100).

Может, у вас получится помочь Алексею решить задачу? Тогда переходите в Академию Selectel.

Теги:
Всего голосов 9: ↑5 и ↓4+2
Комментарии2

По итогам жарких обсуждений и критики по поводу медленного кода и плохого fps в тесте вывода на экран графика sin()+noise для Matplolib были внесены усовершенствования и привлечен ИИ для полировки. Исходная статья и код https://habr.com/ru/articles/878002/

Отказ от медленного вывода текста, применение FuncAnimation вместо простого цикла, применение мэджик команды для подключения PyQT backend. FPS поднялся с 12 до 35. Подробности читайте в исходной статье https://habr.com/ru/articles/878002/

Оригинальная идея второго графика позволила отказаться от медленного вывода текста
Оригинальная идея второго графика позволила отказаться от медленного вывода текста

м

Теги:
Всего голосов 1: ↑1 и ↓0+2
Комментарии7

Как продолжить изучение Python? Работа с БД, парсинг и идеи для пет‑проектов

В Академии Selectel вышел новый бесплатный курс по Python. Не рассказываем про основы — наоборот, помогаем сделать первые шаги в мире реального программирования.

После прохождения курса вы научитесь:

  • работать с базами данных и брокерами сообщений,

  • создавать приложения с графическим интерфейсом,

  • автоматизировать получение данных.

На вдумчивое ознакомление со всеми материалами уйдет около четырех часов.

Приглашаем изучить курс в Академии Selectel.

Теги:
Всего голосов 7: ↑7 и ↓0+8
Комментарии0

Написана статья о тестировании (и сравнении FPS) на скорость рисования 2D графиков на python популярных и относительно малоизвестных графических пакетов 2D и 3D (Mayavi 3D, PyVista, Matplotlib, PyQTGraph, Plotly, PyGame, Arcade, pyOpenGL, VisPy, Bokeh) Возникли некоторые технические проблемы и срок публикации пока не ясен (надеюсь, на следующей неделе). Поэтому, заинтересовавшиеся коллеги, прошу подписаться на мой профиль на хабре, чтобы не пропустить публикацию этой статьи. В статье будут видео с отрисовкой в реальном времени 2D графиков и будут измерены FPS. Специально использовался слабенький мини ПК без дискретки. Тем не мене FPS достигал в некоторых случаях 100. Пример видео ниже:

https://habr.com/ru/articles/878002/

Файлы к статье

Теги:
Всего голосов 5: ↑3 и ↓2+2
Комментарии0

Встроенная оптимизация добавления символов в строку.

Люблю делать мини-эксперименты на Питоне. Попробую оформлять их постами, посмотрю, как пойдёт.

Суть проблемы.

Недавно опять всплыл в обсуждении тот неочевидный факт, что современный Питон оптимизирует добавление символов в строку и не всегда создаёт новые строки при этом. Хотя на собеседованиях мы и говорим, что строки в Питоне иммутабельны, и если мы хотим поменять строку, то Питон нам создаёт новую строку, а старую строку мы изменить не можем... Но при этом существует оптимизация, противоречащая этому очевидному знанию.

В общем, давайте проверим, сохраняется ли строка на том же самом месте памяти. Это мы проверим по 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()

Запустим (часть строк я сократил для наглядности):

|"№|Шаг|Id|
|:---|:---|:---|
|0|0|2160689512496|
|1|1|2160690869616|
|2|1|2160740037552|
|16|14|2160761306960|
|32|16|2160761158704|
|48|16|2160738952768|
|64|16|2160760928688|
|...|...|...|
|448|16|2160739774000|
|464|16|2160724879344|
|465|1|2160724880928|
|...|...|...|
|1016|1|2160635636480|
|2176|1160|2160726063040|
|3200|1024|2160724362096|
|4128|928|2160688590304|
|4576|448|2160635890208|
|4736|160|2160724769808|
|5056|320|2160744468544|
|8096|3040|2160745279680|
|12064|3968|2160703847904|
|13072|1008|2160724677104|
|14592|1520|2160745337504|
|15600|1008|2160724821296|
|16288|688|2160726148256|

Как интересно. Получается такая картина:

  • Первое прибавление. Питон честно выделяет новую строку.

  • Второе прибавление. Питон кажется что-то подозревает и выделяет сразу место под следующие прибавления - по 16 ячеек (но в первый раз чуть меньше).

  • Прибавление 464. Питон почему-то вдруг обратно переключается на копирование строки каждый раз.

  • Прибавление 1016 (тут цифры разные при разных запусках). Питон вдруг вспоминает про оптимизацию и начинает выделять под строку большие куски памяти, довольно неравномерные. Возможно, он выделяет просто те сплошные куски, которые у него есть в куче и поэтому такое отсутствие системы? Тут уже нужно будет смотреть исходники.

В целом картина получается интересная. Кстати, Питон умный и если заменить код на такой, то ничего не изменится, оптимизация сохранится:

string = string + '-'

Оптимизация пропадёт только если сохранять результат в другую переменную.

Почему это важно.

Если бы не было этой оптимизации, то при каждом добавлении символа или строки в нашу строку происходило бы копирование старой строки в новое место, где достаточно памяти под новую строку. Такой процесс имел бы асимптотику O(n2) при добавлении n символов в строку по одному и это было бы очень долго и нерационально. Вместо этого обычно рекомендуют добавлять части строки в список и в самом конце собирать итоговую строку с помощью метода join, что-то типа ''.join(lst). Но, благодаря описываемой тут оптимизации мы видим, что такие добавления можно делать и к строке и производительность при этом должна не сильно страдать. Но конкретика будет зависеть от длины добавляемых фрагментов строки.

"А теперь - слайды!"

Люблю проверять всё "руками", благо Питон это легко и удобно позволяет. Планирую постепенно публиковать и другие эксперименты с Питоном. Спасибо за чтение.

P.S. Таблица в markdown похоже не получилась, подскажите, плиз, как поправить!

P.P.S. Пишут, что начиная с CPython 3.11 эту оптимизацию потеряли. ( Формирование строк через объединение списка вновь актуально.

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии3

RabbitMQ и Memcached в Amvera Cloud

C 14 января 2025 в Amvera Cloud доступны RabbitMQ и Memcached.

Для создания достаточно выбрать необходимый сервис в разделе «Преднастроенные сервисы» и заполнить название и несколько переменных.

В ближайшее время планируется релиз отдельного сервиса управления очередями.

Amvera Cloud — это облако для простого деплоя приложений через git push. Встроенный CI/CD, бэкапы и мониторинг позволяют развернуть проект тремя командами в IDE и не думать о настойке инфраструктуры. Amvera проще, чем использование VPS или Kubernetes-кластера.

Теги:
Рейтинг0
Комментарии0

Работа

Data Scientist
41 вакансия