Задать вопрос
  • Что эффективнее: 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 код в Rust при помощи NodeJS?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Хоть и вопрос несколько сумбурный и не совсем понятно, что автор хочет на самом деле...
    Но краткий ответ: да, возможно, но есть нюансы...

    Самый простой вариант - запускать node как отдельный процесс. Можно просто запускать на каждый чих, а можно заморочиться и организовать общение между приложением на Rust и приложением на Node.js

    Вариант поинтереснее - Node.js можно собрать как библиотеку (есть даже готовые бинарные сборки такого), линкуем с приложением на Rust. Всё живёт в одном процессе, но node будет запускать свои потоки.

    Есть и обратный последнему вариант. Можно из Rust кода собрать бинарный аддон к Node.js
    Правда тут уже JS код будет запускать код на Rust.
    https://napi.rs
    https://neon-rs.dev

    Можно пойти дальше. Если задача просто исполнять JS код из приложения на Rust, то можно слинковаться с одним из JS движков. Приколюх предоставляемых платформой Node.js здесь не будет (вроде fs или http), хотя никто не мешает реализовать это самостоятельно.
    https://crates.io/crates/v8
    https://crates.io/crates/quickjs_runtime
    Ответ написан
    3 комментария
  • Можно ли напрямую подключить кулер(вентилятор) к повышайке на 24V 2A?

    @nehrung
    Не забывайте кликать кнопку "Отметить решением"!
    так как аккум даёт максимум 4.2 v я решил поставить повышайку которая может с 3 вольт поднять до 30 вольт и максимум выдаёт 2 ампер. Кулер потребляет 0.2 ампер. Но безопасно ли подключать таким образом?
    Выбрали экспертом - отвечаю. Судя по этим параметрам, так делать можно. Но надо иметь ввиду, что ток, потребляемый от аккума, будет много больше, чем 0,2 ампера. Насколько меньше напряжение, настолько же больше будет ток. Я буду оперировать напряжением не 30 вольт, а 24, поскольку именно таково штатное напряжение питания вентилятора, и именно на 24 надо настраивать выход вашей повышайки:

    24/4,2=5,7 раз. По мере разряда аккума, его напряжение падает, так что при 3 вольтах 24/3=8 раз.

    0,2 х (5,7...8) = от 1,14 до 1,6 ампер. С учётом того, что КПД повышайки меньше 100%, ток будет даже немного больше.

    Исходя из этого тока и требуемой продолжительности работы вашего вентилятора, выбирайте ёмкость аккумулятора.
    Ответ написан
    8 комментариев
  • Вопрос с собеседования на Java Бекенд. Как гарантировать согласованность операций?

    Я не из МТС банка, но у нас в собесе тоже есть похожий вопрос, но я бы не назвал его простым, так как там дальше ещё много дополнительных вопросов и обсуждений можно невертеть.

    Основная идея заключается в том, что нужно как-то обеспечить транзакционнлсть при общении с левым сервисом.

    Самый простой и часто используемый вариант - Outbox.

    Смысл в том, что мы должны в нашей основной базе завести таблицу, в которой будет записано, что нам нужно отправить запрос в тот сервис и с какими параметрами. (Например отправить письмо по электронной почте)

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

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

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

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

    66ab5b548e5a9142225375.png

    Благодаря тому что мы записываем основные бизнес-данные и намерение сделать запрос в сторонний сервис в одной транзакции - мы гарантируем, что мы не будем отправлять запрос, если данные не записались и наоборот - если данные записались, то мы гарантируем, что попытаемся рано или поздно отправить запрос.
    Ответ написан
    3 комментария
  • Сколько оперативной нужно веб серверу?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Зависит от того, какие сервисы будет обслуживать этот сервер и какую нагрузку эти сервисы будут создавать. Для каждого сервиса эти показатели уникальны. Да, для похожих сервисов они могут быть схожими при условном одинаковом качестве этих сервисов. А могут отличаться в десятки и сотни раз как раз из-за особенностей реализации и разного качества этих сервисов (и еще множества других параметров). Так что в вашем случае вам следует провести нагрузочное тестирование: создать создать нагрузку, более-менее похожую на настоящую и посмотреть что, где и какие ресурсы потребляет. И уже по результатам тестирования решать что делать дальше - оптимизацию, увеличение мощности сервера или еще что-то.
    Ответ написан
    Комментировать
  • Сколько оперативной нужно веб серверу?

    @historydev
    Mistkerl, drück den Knopf.
    Вопрос из разряда погадай на шарике.
    Каждый запрос может тянуть от одного до N действий за собой, помимо самого наличия этого запроса (сетевая карта), каждое действие аналогично может тянуть за собой другие действия.

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

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

    Допустим мы выяснили, что на один запрос тратится 100мб оперативной памяти, 0.1% диска и 5 секунд времени это всё занимает, у нас 10 пользователей и 20 запросов в минуту среднее.

    Средняя общее кол-во запросов: (10 * 20) = 200
    Средний расход диска: (0.1 * 200) = 20%
    Средний расход оперативной памяти: (100 * 200) = 20000
    Ответ написан
    Комментировать
  • Не могу решить задание ЕГЭ. Почему мой код не работает?

    Vindicar
    @Vindicar
    RTFM!
    Тебе выше правильно намекнули.
    Во-первых, нужно увидеть простую вещь: дописывание нуля в конец двоичного представления - это то же, что умножение на 2. Назовём это операция А. А дописывание единицы - то же, что умножение на 2 и прибавление 1. Назовём это операция Б. Таким образом, можно избавиться от двоичной системы в задании.

    Второе: операция А будет давать в результате только чётные числа, независимо от аргумента. Аналогично, операция Б будет давать только нечётные числа, независимо от аргумента.

    Третье: результат как операции А, так и операции Б всегда больше аргумента. Более того, больший аргумент даёт больший результат. Это легко показать.
    Пусть у нас есть число x. Результат операции A меньше, чем операции Б над тем же числом, поэтому мы должны проверить только один сценарий: когда к x применяется операция А, а к x - 1 - операция Б. Значит, x станет 2 * x, а x - 1 станет 2 * (x - 1) + 1 = 2 * x - 1. Т.е. для x - 1 результат меньше. Т.е. даже в таком, самом спорном случае, меньшее число даёт меньший результат

    Четвёртое: задачу можно решать задом наперёд. У нас есть целевые числа - значит, мы должны применить к ним алгоритм наоборот, чтобы получить исходные. Это и даст нам диапазон для поиска исходных чисел.

    Дальше уже проще. Смотрим на начало целевого диапазона, число 876 544. Оно чётное, значит, оно могло быть создано только операцией А. Значит, чтобы получить исходное число, нужно поделить его на 2. 876 544 / 2 = 438 272. Это число тоже чётное, оно тоже могло быть создано только операцией А. 438 272/ 2 = 219 136. Оно тоже чётное. Значит, третий раз применяем операцию А наоборот: 219 136 / 2 = 109 568. Исходя из пункта 3, можем сказать, что числа, меньше 109 568, не могут дать результат, больший или равный 876 544.

    Аналогично анализируем верхнюю границу целевого диапазона.
    1 234 567 899 = 2 * 617 283 949 + 1 (операция Б)
    617 283 949 = 2 * 308 641 974 + 1 (операция Б)
    308 641 974 = 2 * 154 320 987 (операция А)
    Значит, исходное число должно быть не более 154 320 987. Вот тебе и диапазон для поиска.
    А поскольку большие аргументы дают большие результаты, то это означает, что ни одно число меньше 154 320 987 не даст результат, который выйдет за верхнюю границу диапазона (1 234 567 899). Т.е. искомые числа - это весь диапазон от 109 568 до 154 320 987. Посчитать, сколько чисел в диапазоне, тривиально.
    Ответ написан
    Комментировать
  • Не могу решить задание ЕГЭ. Почему мой код не работает?

    chupasaurus
    @chupasaurus
    Сею рефлекторное, злое, временное
    Потому что 876544 / 8 = 109568. Любая математическая задача начинается с расчёта областей определения и значения.
    Ответ написан
    Комментировать
  • SQLite не хочет добавлять данные, введенные пользователем в тг боте в базу данных, что делать?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    INSERT INTO result(name) VALUES (ilya)
    Вы пытаетесь вставить в колонку name значение из колонки ilya. Строки должны быть в кавычках.
    Для защиты от SQL-инъекции нужно использовать плейсхолдеры
    - cur.execute(f'INSERT INTO result(name) VALUES ({data["Name"]})')
    - db.commit()
    - cur.execute(f'INSERT INTO result(name) VALUES({data['School_class']})')
    + cur.execute('INSERT INTO result(name, class) VALUES (?, ?)', (data["Name"], data['School_class']))
    Ответ написан
    Комментировать
  • Зачем кому-то собирать чужие поисковые запросы?

    mihavxc
    @mihavxc
    Описание не до конца понятно, но судя по всему кто-то от имени юзера делает запросы в Поисковик, чтобы собирать статистику на какой позиции в выдаче нужный сайт. Обычно такое через API запросы собирают, но там есть ограничения по количеству запросов.
    Ответ написан
    Комментировать
  • Где вы берете статистические данные?

    Maksim_64
    @Maksim_64
    Data Analyst
    Специалист который занимается, ответами на данный вопрос называется продуктовый аналитик. Основная их работа это выдвижение гипотез в условиях недостаточности данных. Иными словами сведение к математическому виду определенного утверждения.

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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Абсолютно неважно, что было до интересующего вас события. Важно лишь сколько каких шаров было в мешке в момент события.
    Ответ написан
    6 комментариев
  • Как "зафиксировать" список в питоне?

    fenrir1121
    @fenrir1121
    Начни с документации
    Вернуться к изучению основ, разобраться как работают изменяемые объекты, что такое передача по ссылке и по значению, формулировать какую вообще задачу вы решаете подобным кодом.

    Сейчас вы ссылаетесь на один и тот же объект 3 раза, вместо создания нового объекта.
    Исправляется созданием плоской копии списка.
    lst = []
    l = []
    for i in range(3):
        l.append(i)
        lst.append(l[:])
    print(lst)
    Ответ написан
    Комментировать
  • Как поменять формат времени в сообщении discord бота?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Тебе нужен discord timestamp в формате Relative time
    Ответ написан
    1 комментарий
  • При нажатие на кнопку в telebot ни сего не происходит, проблема и её решение?

    Vindicar
    @Vindicar
    RTFM!
    @bot.callback_query_handler(func = lambda callback: True)

    Ты говоришь боту "если пользователь нажал кнопку, вызови функцию ниже, и делай это для любых кнопок" (func = lambda callback: True). Но у тебя в коде ДВЕ функции-обработчика, и обе говорят, что их надо вызывать для любых кнопок. Бот в таком случае вызывает только одну из них.
    Измени func так, чтобы она проверяла, какая кнопка нажата. Например, если укажешь
    func = lambda callback: callback.data == 'register'
    , то только кнопка, отдающая строку "register", будет вызывать срабатывание этой функции.

    Если тебе удобнее сделать выбор внутри функции, то можно сделать так:
    func = lambda callback: callback.data in ('faq', 'register')
    , тогда функция ниже будет вызвана при нажатии любой из двух кнопок, и тебе нужно будет внутри функции выбрать один из двух вариантов.

    В любом случае, нельзя допускать, чтобы у двух и более обработчиков проверка подходила под одну и ту же кнопку.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы intelephense не ругался на Auth::user()->save()?

    delphinpro
    @delphinpro
    frontend developer
    Найдите 10 отличий =)

    667d607210255741153864.png

    667d6079278b8291209444.png

    667d607f0d109127603243.png

    PS

    Правильнее вот такую аннотацию сделать

    /* @var null|\App\Models\User $user */
    $user = Auth::user();


    Всё-таки этот метод может и null вернуть.
    Ответ написан
    4 комментария
  • Обработка params ?fields в апи запросе для вывода в response?

    Vindicar
    @Vindicar
    RTFM!
    Рекурсивно делай. Опиши требуемую функцию:
    def filter_fields(obj: dict[str, ...], fields: list[str]) -> dict[str, ...]:
        """obj - фильтруемый словарь, fields - множество полей, которые надо оставить."""
        ...

    Проблема в том, что поля могут быть вложенным. Тогда первым делом составляешь набор нужных тебе полей верхнего уровня:
    top_level_fields = {}
    for f in fields:
        top, _, bottom = f.partition('.')
        top_level_fields.setdefault(top, [])
        if bottom is not None:
            top_level_fields[top].append(bottom)

    Для
    fields=['boardId', 'name', 'Data.Matches.t.id', 'Data.Matches.m']
    в top_level_fields получишь
    { 'boardId': [], 'name': [], 'Data': ['Matches.t.id', 'Matches.m']}

    Дальше перебираешь поля, собираешь их значения в один мешок и смотришь, есть ли для них нижележащие поля:
    output = {}
    for top, bottom in top_level_fields.items():
        if bottom:
            output[top] = filter_fields(obj[top], bottom)  # что делать, если ключа top нет?
        else:
            output[top] = obj[top]

    Таким образом наберёшь всё, что надо.
    Ответ написан
    Комментировать
  • Где найти ошибку в коде?

    Vindicar
    @Vindicar
    RTFM!
    Почитай про импорты в питоне, какой-нибудь толковый учебник (типа Лутца).
    Ты делаешь относительный импорт (import .something), но это можно использовать только в крупных модулях проекта, а не в корневых файлах. Импортируй как обычно, без точки.
    Ответ написан
    Комментировать
  • Как обрабатывать ошибки в асинхронном коде?

    Vindicar
    @Vindicar
    RTFM!
    try: 
        loop.create_task(exc())
    except ZeroDivisionError as ex:
        print(f"Ошибка {ex} обработана")

    1. Ты создаёшь задачу на базе корутины exc(). Созданная задача не выполнится немедленно, а только встанет в очередь исполнения (хотя в питоне 3.12 это поведение можно изменить, но по умолчанию это так). При этом с корутиной ассоциируется future-объект, который находится в состоянии "ожидание", так как корутина ещё не завершила работу.
    2. Ты проверяешь, не возникло ли исключение в процессе создания задачи. Это может произойти, только если exc() - не корутина. В остальных случаях операция будет успешна независимо от содержания exc(), так как см. пункт 1.
    3. Ты вызываешь loop.run_forever(). Рабочий цикл (loop) смотрит в очередь исполнения, и видит в нём только корутину exc(). Она получает управление.
    4. Корутина exc() выбрасывает исключение, но не ловит его. Ассоциированный с корутиной future-объект переходит из состояния "ожидание" в состояние "отказ", и сохраняет информацию об исключении. exc() завершает работу.
    5. Рабочий цикл проверяет, кто хранит ссылку на task - и понимает, что никто. Как следствие, даже в будущем никто не сможет узнать, что корутина выкинула исключение. Поскольку рабочий цикл - штука типовая, он понятия не имеет, что делала наша корутина и как надо реагировать на исключение в ней. А потому единственный вариант для него - написать в журнал работы о непойманном исключении и надеяться, что программист это увидит и поправит.
    task = asyncio.create_task(exc())
    try:
        # await asyncio.gather(task)  # <- gather() не нужно, если у тебя одна задача
        await task
    except ZeroDivisionError as ex:
        print(f"Ошибка {ex} обработана")

    1. Ты создаёшь задачу (успешно), а потом с помощью await-вызова просишь дождаться её завершения и получить результат.
    2. Корутина main() приостанавливает своё выполнение и сохраняет свой контекст, а также встаёт в очередь, ожидая, когда сработает future-объект, связанный с task.
    3. Рабочий цикл (loop) asyncio смотрит в очередь выполнения и видит, что корутина exc() готова выполняться (она не находится в await вызове, а только начала работу).
    4. Корутина exc() получает управление, выполняется, и генерирует исключение, которое не поймано внутри этой корутины. Future-объект, связанный с этой корутиной, переходит из состояния "ожидание" в состояние "отказ", и сохраняет информацию об исключении. Корутина exc() завершает выполнение. При этом о её future-объекте знает корутина main(), поэтому рабочий цикл не дёргается по этому поводу - у main() будет возможность отреагировать на происходящее.
    5. Рабочий цикл (loop) смотрит в очередь выполнения и видит, что там только корутина main(), причём она готова выполняться - future-объект, который она ждёт, более не находится в состоянии ожидания.
    6. Корутина main() получает управление и восстанавливает свой контекст, продолжая с того места, где она остановилась. Так как future-объект находится в состоянии "отказ", оператор await читает из него информацию об исключении и перевыбрасывает это исключение внутри main().
    7. Это исключение обрабатывается блоком try-except в main() как обычно.
    Ответ написан
    Комментировать