• Прирост в производительности после переноса алгоритма с Python на C++/C?

    Vindicar
    @Vindicar
    RTFM!
    У тебя вычисление повторяется для каждой строки? Посмотри, можно ли распараллелить код на несколько процессов (именно процессов, не потоков).
    Также посмотри насчёт использования numpy/scipy и их численных солверов для систем уравнений вместо sympy. Может, используя sympy, получится сформулировать алгоритм расчёта, а уже его портировать на numpy?

    Если надумаешь использовать numpy, держи в уме вот что: по возможности выполняй операции сразу над массивами значений. Упрощённо, вот это
    a = numpy.array([3] * 1000000, dtype=numpy.float32)
    b = 2 * a + 3

    будет намного быстрее, чем это:
    a = numpy.array([3] * 1000000, dtype=numpy.float32)
    b = numpy.zeros_like(a)
    for i in range(a.shape[0]):
        b[i] = 2 * a[i] + 3

    Причина простая - операции над массивами реализуют перебор элементов массива нативно, т.е. с той же проивзодительностью, что и C/C++/Fortran. А вот сугубо питоньи циклы - штука медленная.
    Ответ написан
  • Как добавить в базу данных два сообщения в телеграмм боте?

    Vindicar
    @Vindicar
    RTFM!
    bot.register_next_step_handler(message, impact_KEYBORD_bot)
    bot.register_next_step_handler(message, donat_user_bot)
    bot.register_next_step_handler(message, translate_message)
    bot.register_next_step_handler(message, dictionary_message)

    Так ты выбери что-то одно. У одного сообщения может быть только один next step handler. Если нужна цеполчка из более чем двух шагов, то на втором шаге ставь следующий handler, и так далее.
    Ответ написан
  • Как проверить возможность отправки сообщений пользователям?

    Vindicar
    @Vindicar
    RTFM!
    Нет. Только считать последние успешно/неуспешно отправленные сообщения.
    Ответ написан
    Комментировать
  • Как написать тг бот-секундомер на питоне?

    Vindicar
    @Vindicar
    RTFM!
    В коде дикая каша - или у тебя отступы уехали чёрт знает куда. Такое не заработает.
    Начни с официальных примеров, найди среди них наиболее похожий - скажем, вот этот таймер. Разберись, как он устроен, и потихоньку модифицируй.
    Разумеется, предполагается, что ты хотя бы насколько-то знаешь питон. Если это не так - откладываешь бота и учишь язык.
    Ответ написан
    Комментировать
  • Ошбика при запуске ТГ бота на платном сервере pythonanywhere [Errno 101]?

    Vindicar
    @Vindicar
    RTFM!
    А ты прокси их указал, proxy.server:3128? Весь доступ в сеть только через него производится.
    Бесплатные учётки к тому же могут обращаться только вот к этим сайтам.
    И да, это реально такое имя домена, оно доступно только во внутренней сети pythonanywhere.
    Ответ написан
    1 комментарий
  • Как организовать локальную разработку микросервисной системы в PyCharm?

    Vindicar
    @Vindicar Автор вопроса
    RTFM!
    Нашел один вариант - может, и не лучший, но приемлемый для учебных задач.
    1. Брокер сообщений
    Пакет kombu реализует работу с брокерами сообщений в Celery. Помимо типовых транспортов типа RabbitMQ и Redis, у него есть транспорт filesystem, причём позволяющий общаться именно разным процессам. Транспорт in-memory работает только для одного процесса. И тот, и другой транспорты не требуют отдельного брокера - они сами себе брокеры.
    На мой неопытный взгляд, потом сменить транспорт на "взрослый" будет несложно. А значит, вполне можно на эту библиотеку опираться, начиная с этапа прототипа.
    Единственное "но" - под виндой надо дополнительно поставить pywin32, kombu его сам не подтаскивает.
    2. Запуск системы
    PyCharm, оказывается, умеет создавать конфигурации запуска для нескольких скриптов.
    Нужно сначала создать конфигурации под каждый сервис в системе. Можно использовать автосозданные, а можно вручную. А затем добавить конфигурацию типа Compound, и добавить в неё компонентами нужные "одиночные" конфигурации. Они запустятся параллельно, и остановить их тоже можно все сразу. У каждого сервиса даже будет своя консоль вывода.

    Если никто не предложит варианта получше - на этом и остановлюсь.
    Ответ написан
  • Не настраиваются разные уровни логирования в python logging?

    Vindicar
    @Vindicar
    RTFM!
    Ты задал уровень WARNING для самого логгера (не для хэндлеров), поэтому он INFO отбрасывает сходу. До хэндлеров ничего не доходит просто.
    Я бы использовал эту либу немного по-другому (пример с её гитхаба)
    t_handler = tg_logger.TgLoggerHandler(users=[...], token=TELEGRAM_TOKEN)
    t_handler.setLevel(logging.WARNING)
    logger.addHandler(t_handler)

    Так куда более похоже на обычные лог-хэндлеры, проще управлять и читать даже если с либой мало знаком.
    Ну или если очень хочется setup(), то так:
    t_handler = tg_logger.setup(logger, token=token, users=users, tg_format="<b><u>%(name)s</u> : %(levelname)s</b>\n\n<code>%(message)s</code>")
    t_handler.setLevel(logging.WARNING)


    Так что логгеру задай уровень подетальнее, INFO или даже DEBUG, а тонкую настройку делай на уровне хэндлеров.
    Ответ написан
    2 комментария
  • Почему код работает, только, если замедлять сервер до 5 кадров секунду?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, как именно не работает? Комп встаёт со стола и идёт искать Сару Коннор?
    Во-вторых,
    getData = client_socket.recv(1024).decode('utf-8').split(' ')

    А если клиент не прислал данные, то сервер будет стоять и ждать на этой строке, пока хоть что-то не придёт. Хуже, recv() в общем-то не гарантирует, что данные придут одной порцией. На это можно полагаться до килобайта, но выше может быть фрагментация.
    Ну и наконец, ты сейчас пытаешься каждый кадр передавать полную информацию о происходящем в игре. Это может и надёжно, но не быстро.
    Ответ написан
    4 комментария
  • Как настроить OpenVPN для 1 устройства?

    Vindicar
    @Vindicar
    RTFM!
    Выше верно написали. OpenVPN мог бы решить такую задачу, если нап каждом устройстве был бы свой клиент openvpn.
    А так - убрать redirect-gateway, на роутере прописать статический IP "заворачиваемому" устройству, прописать в up script для openvpn добавление правил роутинга, чтобы все пакеты с "заворачиваемого" устройства роутились через VPN. В down прописать удаление этих правил.
    Если соединение стабильное и не хочется морочиться, правила можно прописать статически.
    Ответ написан
    Комментировать
  • Как сделать чтобы бот ждал какое-то время, но при этом обрабатывал запросы?

    Vindicar
    @Vindicar
    RTFM!
    asyncio.sleep() вполне хватит.
    Бот должен знать своё состояние ("покой", "сбор игроков", "игра идёт", ну и так далее).
    Один обработчик (начало игры) проверяет, что сейчас состояние "покой", отправляет приглашение, ставит состояние "сбор игроков" и ждёт заданное время. По итогам ожидания проверяет список игроков. Если нужного числа игроков в списке нет, ставит состояние "покой", иначе "игра идёт".
    Второй обработчик (игрок присоединился) проверяет, что сейчас состояние "сбор игроков". Если да, добавляет отправителя в список игроков.

    Как хранить состояние, список игроков и другую игровую инфу, зависит от того, может ли параллельно идти несколько игровых сессий. Если не может, то достаточно простых глобальных переменных. Если может... всё сложнее.
    Ответ написан
    1 комментарий
  • Деление строки в список Python?

    Vindicar
    @Vindicar
    RTFM!
    Там список хранит данные о rect из pygame, это отрисовка поля

    Так передавай данные так, чтобы их удобно было парсить. Простейший вариант - используй json.
    Например, сначала генерируешь данные для отправки:
    import json
    # в словаре для отправки могут быть только числа, строки, bool, списки, словари, None.
    # и никаких других объектов. Так что переделываем список rect в список списков.
    # как из rect координаты добыть ищи сам
    rects_to_send = [ [rect.x, rect.y, rect.w, rect.h] for rect in rectangles ]
    data_to_send = {  # в словарь можно также добавить другие данные
      'rects': rects_to_send,
    }
    string_to_send = json.dumps(data_to_send, ensure_ascii=True)+'\n'
    # дальше через сокет эту строку и передаёшь

    Ну и чтение аналогично.
    import json
    
    received_string = ...  # это строка, которую ты получил из сокета
    received_data = json.loads(received_string)
    #received_data будет таким же словарём, как data_to_send выше
    for x, y, w, h in received_data['rects']:
      ...  # рисуешь эти прямоугольники у себя
    Ответ написан
    2 комментария
  • Sign in to confirm you’re not a bot. This helps protect our community. Learn more (Yt-dlp) - как решить?

    Vindicar
    @Vindicar
    RTFM!
    Ну тебе же английским по-белому написано, что анонимов ютуб не любит. Залогинься и передавай в yt-dlp полученные куки, там для этого есть аж два способа.
    Ответ написан
    6 комментариев
  • Можно ли создать бота который действия из LINUX будет перенаправлять в Telegram сообщением?

    Vindicar
    @Vindicar
    RTFM!
    Вполне можно. Отправить через бот сообщение в телегу, если не требуется приём сообщений от пользователя, можно даже через curl/wget. Вопрос стоит, как собрать в одном файле все требуемые тебе события.
    Можно начать с чего-то вроде этого (код только передаёт общую идею, не гарантирую, что он сходу заведётся)
    #!/bin/bash
    FILE=тут/файл/который/мониторишь
    TOKEN=ТУТ_ТОКЕН_БОТА
    CHATID=ТУТ_НУЖНЫЙ_CHAT_ID
    
    send() {
      # тут реализуешь отправку сообщения, которое лежит в $1
      curl -X POST \
         -H 'Content-Type: application/json' \
         -d '{"chat_id": "$CHATID", "text": "$1", "disable_notification": true}' \
         https://api.telegram.org/bot$TOKEN/sendMessage
    }
    
    while read line; do
      #тут проверяешь строку на соответствие регулярным выражениям, и шлёшь сообщение
      [[ "$line" =~ 'logged in' ]] && send "User logged in"
      [[ "$line" =~ 'logged out' ]] && send "User logged out"
    done <<(tail -f $FILE)
    Ответ написан
    6 комментариев
  • Как грамотно распределять по websocket данные получаемые из одного источника?

    Vindicar
    @Vindicar
    RTFM!
    Хоть убейся, но нужно два компонента.
    Постоянно работающий сервис, который держит коннект к серверу 1 и пишет инфу в твою БД.
    И основной сервис для взаимодействия с клиентами, который умеет отдавать инфу клиенту согласно его запросу (дата, какой тикер отдавать, и так далее).
    Ответ написан
  • Что эффективнее: np.array_equal или (A == B).all()?

    Vindicar
    @Vindicar
    RTFM!
    Модуль timeit в руки и вперёд, измеряй

    >>> timeit.timeit(stmt='(A == B).all()', setup='import numpy; A, B = numpy.zeros((1000,)), numpy.zeros((1000,))', number=10_000_000)
    20.43348090001382
    >>> timeit.timeit(stmt='numpy.array_equal(A, B)', setup='import numpy; A, B = numpy.zeros((1000,)), numpy.zeros((1000,))', number=10_000_000)
    27.85776079981588
    >>>


    Правда, есть у меня уверенность, что A == B создаёт временный массив, так что это менее эффективно по памяти. А вот делает ли так array_equal() - не знаю.

    EDIT: открыл исходники функции...
    return builtins.bool((a1 == a2).all())
    Ну ты понел.
    Ответ написан
    5 комментариев
  • Как переместить курсор в нужную позицию с помощью JavaScript?

    Vindicar
    @Vindicar
    RTFM!
    Нет, курсор двигать нельзя по очевидным причинам. Представь сайт, который принудительно удерживает курсор на себе, не давая передвинуть его на Х.
    Ты можешь схитрить так: навесить на всплывашку cursor: none, запомнить текущие координаты курсора, и смотреть на смещение курсора относительно этих начальных координат. Не самый надёжный способ, но это кое что.
    Ответ написан
    2 комментария
  • У меня ошибка TypeError: 'list' object is not callable Что делать?

    Vindicar
    @Vindicar
    RTFM!
    Всё перепробовал, а прочитать внимательно - не пробовал.
    Почему ты вообще трогаешь message_handlers, это не декоратор, а список установленных обработчиков. Даже по названию можно догадаться - handlers во множественном числе.
    Тебе нужен message_handler.
    Смотри официальные примеры.
    Ответ написан
    Комментировать
  • Почему не получается запустить клиент через run в Pyrogram?

    Vindicar
    @Vindicar
    RTFM!
    В документации pyrogram английским по белому написано (выделение моё):
    Client.run()
    Start the client, idle the main script and finally stop the client.
    When calling this method without any argument it acts as a convenience method that calls start(), idle() and stop() in sequence. It makes running a single client less verbose.

    pyrogram.idle()
    Block the main script execution until a signal is received.

    Отсюда вывод: у тебя дальше self.client.run() управление не пойдёт, даже конструктор Account не завершится, не говоря уж о вызове new_account.start_messaging().

    И к слову о нём: ты сделал этот метод async, а вызываешь его как будто он синхронный. WTF?
    Ответ написан
  • Есть ли альтернатива декораторам из Python в Java?

    Vindicar
    @Vindicar
    RTFM!
    Насколько хватает моих скромных познаний, механизма, полностью эквивалентного питоновским декораторам, нет и быть не может (если не лезть в байткод).
    Но вот каждый отдельный use case для декораторов, наверно, можно реализовать, так или иначе. Так что изволь написать, что ты пытаешься сделать с их помощью.
    Ответ написан
    Комментировать
  • Как проходить список и одновременно удалять элементы, в том числе впереди курсора?

    Vindicar
    @Vindicar
    RTFM!
    Сделай цикл while и наращивай индекс текущего элемента сам, в отдельной переменной. Если элемент не нужен - удаляешь его, если нужен - увеличиваешь индекс.
    Альтернативно, ты можешь просто проходить список с конца, тогда "съезжать" будут только те элементы, которые ты и так уже обработал. Будет простой цикл с шагом -1.
    Ответ написан
    Комментировать