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

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

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

Теги:
Всего голосов 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

Добавляем подписку с Telegram Stars в свой апп

Я очень радовался 14.08.2024 из‑за выхода очередного релиза Телеграм, в котором они анонсировали подписки за звезды, потому что это сильно облегчало мое взаимодействие с клиентами: они один раз подписываются и далее не имеют проблем с повторными платежами, вместо этого звезды тихонько списываются у них с счетов. В этом посте я расскажу, как прикрутил подписку в звездах к своей Telegram Mini App (TMA).

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

При каждом снятии звезд клиент получает подобное сообщение
При каждом снятии звезд клиент получает подобное сообщение

Свои подписки можно посмотреть у себя в профиле. Это выглядит так:

https://storage.googleapis.com/memes-repo/tutorial/100000998111.png

Отменить подписку можно, если вы зайдете в ее детали.

https://storage.googleapis.com/memes-repo/tutorial/1000009980.png

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

  1. Создать счет на подписку.

  2. Подтвердить оплату.

  3. Принять первое и последующие сообщения об оплате.

### Создание счета

Для создания счета вызываем метод createInvoiceLink.

    def create_invoice(admin_chat_id: str, 
                       channel_id: str, 
                       title: str, 
                       description: str,
                       tariff_id: int, 
                       tariff_price: int,
                       ) -> dict:

        data = {
            "chat_id": admin_chat_id,
            "title": title,
            "description": description,
            "payload": json.dumps({"t": tariff_id}), 
            "provider_token": "",  # Empty
            "currency": "XTR", # required
            "prices": [{'amount': tariff_price, 'label': title}],
            "subscription_period": 2592000,
        }

        r = requests.post(f"{TG_API_URL}{TG_OP_SEND_INVOICE}", json=data)

Вещи, на которые обращаем внимание:

  1. provider_token пустая строка

  2. currency обязательно строка XTR

  3. subscription_period обязательно 2 592 000

  4. prices содержит только один элемент

### Подтверждение оплаты

Для получения подтверждения оплаты счета вам нужно добавить в ваш webhook (allowed_updates) подписку на pre_checkout_query. После этого вы начнете получать update c данным полем и структурой.

Когда вы получаете такой апдейт, вам нужно отреагировать на него в течение 10 секунд: принимаете или отклоняете (например, если этот счет уже был оплачен и другие краевые условия).

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

        pre_checkout_data: PreCheckoutData = {
            "id": packet["pre_checkout_query"]["id"],
            "currency": packet["pre_checkout_query"]["currency"],
            "total_amount": packet["pre_checkout_query"]["total_amount"],
            "invoice_payload": json.loads(packet["pre_checkout_query"]["invoice_payload"])
        }

Для подтверждения или отклонения оплаты счета используйте метод answerPreCheckoutQuery.

### Принять сообщения об оплате

На мое удивление сообщение об оплате встроено в существующий объект Message, так что не нужно дополнительно подписываться на новые источники данных. Вместо этого, мы просматриваем все message в поисках поля successful_payment или refunded_payment и записываем в статистику (для возможного возврата в том числе).

Обратите внимание! В структуре SuccessfulPayment есть параметр is_first_recurring, и я думал, что он True для первого платежа подписки и False для последующих, но! в последующих его просто нет (это допустимо, так как это необязательный параметр).

На этом все, как только вы начали получать successful_payment, вам не нужно больше делать ничего, чтобы клиент продлил подписку.

P.S. Вы всегда можете обновлять срок подписки при получении данного сообщения, читая поле subscription_expiration_date. Если successful_payment перестал приходить, то и подписка не обновится.

Ваш Дима из TG Defender, защита вашего Telegram канала от наплыва ботов на стиле.

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

Привет,Хабровчане ! Неожиданно решился на создание этой публикации – пусть она окажется полезной для кого-то из вас. Представьте ситуацию: рабочий день позади, включаем компьютер, запускаем музыкальное сопровождение и... прямо в кресле дивана нас уже сморит Морфей. Пробуждение же наполняет осознанием неразрешимой дилеммы – выключить ПК или переключить трек? Особенно когда репертуар оставляет желать лучшего!

Вот и приходится преодолевать себя, чтобы добраться до компьютера.

Так вот, в качестве решения этой проблемы разрабатываю приложение для Android с небольшим сервером на PC (начало только под Windows).

Основной фишкой станет регулировка яркости экранов, удаленное отключение ПК, переключение треков в плеере.

Телефонное приложение будет максимально чистым: без рекламы, подписок или дополнительных платежей.

Я – инженер(технарь), а не профессиональный программист, так что обещаю уделять больше внимания техническим моментам .

Все будет сделано в меру моих умений и возможностей. Благодарен за внимание! По мере продвижения работы буду дополнять этот пост новыми деталями.

А какого функционала не хватает вам ?

Пока все в стиле демо
Пока все в стиле демо

Сделал ещё несколько дэмок . 2 приложения на kivymd (python3) связь с сервером http запросами ,но вес приложения уменьшить не удалось . Попробовал на flutter спасибо Гуглу ,ии и другу разработчику ,связь. с сервером с помощью протокола mqtt.

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

Я периодически просматриваю, рекомендации GitHub — там попадаются интересные библиотеки и люди. И вот после написания статьи Что не так с cProfile в Python GitHub через некоторое время подкинул ссылку на репозиторий tuna: Python profile viewer.

Как заявляет автор, в своём инструменте он порешал, проблемы, которые имеются в SnakeViz (связанные с невозможностью восстановить граф вызовов). И на мой взгляд, автор tuna заблуждается и вводит остальных в заблуждение — проблемы он не решил, а скорее замел под ковер. «Решение», которое он выбрал — если мы не можем показать достоверную информацию о вызовах, то просто не будем ее показывать. «Решение» отличное. Да на небольших примерах это сработает (или, например, для ячеек в Jupyter), но как только граф вызовов разрастется и там появятся повторные вызов, ценность tuna резко уменьшится.

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

Как создавать веб-приложение на Django с нуля?

Внутри — четыре инструкции по веб-разработке на Django. Начинаем с создания и настройки простых проектов: блога и канбан-доски. Затем переходим к подключению автоматических бэкапов. Изучение займет не более часа.

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

  • работать с бэкендом и API,

  • создавать веб-приложение по шаблону от Django,

  • настраивать Nginx для обработки запросов,  

  • развертывать Django-приложение с помощью Gunicorn.

Переходите в Академию Selectel и изучайте курс.

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

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

Сбор семнтики из Гугла (Гугл Вордстат существует)!

В общем такая ситуация - я писал не так давно пост, про парсинг семантики для Гугла, вот он - https://habr.com/ru/articles/867876/

В конце статьи я уточнил, что главная подлянка этой схемы - необходимость одобрения Гуглом базового доступа вашего аккаунта, иначе вся эта затея окажется просто текстом на экране. И не скрою, на момент написания статьи, у меня этого базового доступа не было, но вся правда в том, что я его наконец-то получил!

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

Но оно того реально стоит, за 5 дней я обработал 50000 входящих ключевых слов и вытащил около 70к ключей для дальнейшей обработки.

Да, абсолютно бесплатно! Вот в эти моменты становится хорошо!!!

Не превышайте лимиты!!!

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

По просьбам трудящихся запилил новую версию скрипта для автоматического получения наград в telegram mini app BLUM

Функционал пока такой:

  • играет на билеты

  • получает ежедневную награду

Тестил мало, поэтому приглашаю присоединиться. Но вроде бы всё работает, по крайней мере до следующей обновы приложения.

GitHub: https://github.com/Bednyakov/BLUM-autoplay

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

Праздничный unixporn: python vim ide в контейнере

В разработке на python, особенно в DS/ML проектах, мы все сталкиваемся со сложной схемой зависимостей на специфичной аппаратной платформе. Зачастую, вести разработку удобно в том окружении, в котором в последствии запускается приложение.

Если вы вдруг vim user, то можно просто доставить редактор в контейнер с окружением и разрабатывать прямо там. Такая схема достаточно лекговесна, позволяет относительно просто держать актуальными завистимости при разработке, переиспользовать существующие сборочные конвейеры с небольшим наборов слоёв для самого редактора. Так же это может быть удобно, если вам нужно работать где то на удалённом кластере по ssh.

У меня был некоторый шаблон Dockerfile с добавкой vim с плагинами который кочует из проекта в проект и я решил поделиться с вами этой наработкой.

С Новым годом!

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

Обновления января 2025 года в Amvera Cloud

Многие ждали, писали, но нет, мы цены повышать не будем!)

Зато сразу после 1 января праздников, ориентировочно 13—17 января

  1. Выкатим новый фронт. Надеемся, все станет понятнее.

  2. Появятся преднастроенные RabbitMQ и Memcached.

  3. Расширенные алерты и пробы. Можно будет настроить алерты на падение проекта, превышение заданного потребления ОЗУ и CPU и появления определенных ошибок в логах. Дополнительно появятся liveness и readiness пробы.

  4. Мы вводим SLA. Осенью 2024 были инциденты с падением сервисов. Мы готовы нести ответственность за безотказность работы сервиса. Начиная с января 2025, если наша надежность окажется ниже 99,5% в месяц, можно будет претендовать на компенсации с нашей стороны.

SLA действует с 1 января 2025

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

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

Пет-проект на 2025: модель кровообращение человека для спортивной физиологии

Эта идея пришла мне в голову совсем недавно. Беглое изучение научных работ показало востребованность данной тематики и отсутствие реальных публичных наглядных интерактивных моделей на python. Ниже очень примерный рисунок как бы могла бы выглядеть визуально такая модель.

Для предварительной проработки возможности создания такой модели пока нашел только следующий пакеты и системы:

  • OpenModelica — это открытая платформа для моделирования и симуляции, поддерживающая язык Modelica. OpenModelica Connection Editor (OMEdit) позволяет создавать и симулировать модели гидравлических систем.

  • PyFMI — это библиотека Python для работы с моделями, созданными в Modelica. Она позволяет загружать и симулировать модели, созданные в OpenModelica, непосредственно из Python.

  • PySMO — (Python Simulation Modeling): Это библиотека Python для моделирования и симуляции различных физических систем, включая гидравлические.

  • PyDSTool — (Python Dynamical Systems Toolkit): Это инструмент для моделирования и анализа динамических систем.

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

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

Новогодняя задача: помогите Тирексу поставить и нарядить елочку

Условие

Сисадмин Тирекс засиделся допоздна и не успел не то что нарядить елку, но даже купить ее! У него нет главного символа праздника, но есть лапки, компьютер, IDE, технический склад ума и знание Python.

Задача

Помоги Тирексу вывести в консоли наряженную елку на любимом языке программирования. Педантичный Тирекс предъявляет следующие требования:

  • на вход программа получает два числа: rows отвечает за высоту елки в строчках (не менее трех), freq — за частоту появления украшений.

  • ветки елки — символ *.

  • игрушки — символы о, О, @ и 0.

  • елка имеет ствол из трех символов | и стоит на полу из символов _.

  • ветви елки расположены «ступенями»: первая состоит из трех строк, каждая следующая ниже — на одну больше.

  • первая строка следующей ниже «ступени» должна иметь на два символа меньше, чем последняя строка предыдущей.

  • елка должна иметь границы в виде символов /  и  \.

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

  • украшения не должны висеть на границе елки (они же упадут!).

Бонусная задача

  • вывести снег символом . (точка).

  • раскрасить елку зеленым, фон — синим, игрушки — разными цветами (кроме зеленого и синего), снег — белым.

Попробуйте решить задачу самостоятельно и делитесь своими идеями в комментариях. А вариант ответа Тирекса ищите в Академии Selectel.

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

WebTransport: будущее потокового вещания и коммуникаций.

В сети появились интересное, как по мне, видео с конференции rubyconf2024. В нем рассказывается об эволюции веб-протоколов передачи данных, от веб-сокетов до веб-транспорта, а также грядущую спецификацию HTTP 3. Из видео можно узнать о двунаправленной потоковой передаче, дейтаграммах и потенциале веб-кодеков для потоковой передачи видео. 

Всем кому любопытно, то рекомендую к просмотру: https://youtu.be/WqYExpMWIUU?si=p4gSGHXkhHAS4LK_

Для питонистов и тем кому интересно хочу перекомендовать к прочтению статью о webtransport и библиотеке на python aioquic [habr].

Что такое веб-транспорт?

Web Transport — это новый веб-протокол, разработанный для улучшения существующих решений, таких как WebSockets и события, отправляемые сервером (SSE). Хотя Web Transport часто называют «WebSocket 2.0» из-за его расширенных возможностей, он предлагает более тонкие функции, такие как однонаправленная и двунаправленная потоковая передача, дейтаграммы и улучшенная обработка частичной надёжности. В настоящее время этот протокол поддерживается в виде черновика основными браузерами, такими как Firefox и Chrome, а вскоре его поддержка появится и в Safari.

Ключевые особенности

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

  • Дейтаграммы: в отличие от более ресурсоёмких веб-сокетов, дейтаграммы требуют меньше ресурсов и допускают потерю пакетов, что может быть преимуществом в сценариях, где надёжность не является критически важной.

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

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

Работа

Data Scientist
45 вакансий