Задать вопрос
  • Какова временная сложность del[pos:] для списка в Python?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Сложность O(n).
    Если делать замеры для списков разных размеров, то увидим что время выполнения растёт линейно, что подтверждает сложность O(n).

    Если же сложность не O(1), то почему? Ведь перемещать ничего не надо.
    Удаление среза реализовано как проход по удаляемым элементам с вызовом Py_DECREF на каждый.

    З.Ы. чисто теоретически сложность O(1) может быть для крайнего случая с pos = 0, если целиком уничтожается вся структура (но так ли это в реальности надо проверять) и pos = n - 1.
    Ну и надо разделять абстрактную алгоритмику и конкретные бенчмарки.

    6867dce1a31c0265426845.png

    Код.
    import time
    import matplotlib.pyplot as plt
    
    
    def test_del_slice_complexity():
        sizes = [10 ** 3, 10 ** 4, 10 ** 5, 10 ** 6]
        times = []
    
        for n in sizes:
            # Создаем список
            my_list = [1] * n
    
            # Замеряем время удаления
            start_time = time.perf_counter()
            del my_list[n // 2:]  # Удаляем 50% элементов
            end_time = time.perf_counter()
    
            elapsed = end_time - start_time
            times.append(elapsed)
    
            print(f"n = {n:>7}: {elapsed:.6f} сек")
    
        # Визуализация результатов
        plt.figure(figsize=(10, 5))
        plt.plot(sizes, times, 'o-', label='Измеренное время')
        plt.plot(sizes, [times[0] * n / sizes[0] for n in sizes], '--', label='Ожидаемое линейное время')
        plt.xscale('log')
        plt.yscale('log')
        plt.xlabel('Размер списка (n)')
        plt.ylabel('Время выполнения (сек)')
        plt.title('Сложность операции del my_list[n//2:]')
        plt.legend()
        plt.grid(True)
        plt.show()
    
    
    if __name__ == "__main__":
        test_del_slice_complexity()
    Ответ написан
    4 комментария
  • Как вставить переменную в re.sub?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Несколько вариантов решения задачи:
    import re
    
    text = "ab b b b"
    var = "b"
    
    text1 = f"[^a-z]{var}"
    print(re.sub(text1, "", text)) # ab
    
    text2 = "[^a-z]{}".format(var)
    print(re.sub(text2, "", text)) # ab
    
    text3 = "[^a-z]" + var
    print(re.sub(text3, "", text)) # ab
    
    text4 = "[^a-z]%s" % var
    print(re.sub(text4, "", text)) # ab

    P.S. Примеры выше не используйте при формировании sql запросов, для этого используйте параметризованные запросы (prepared statements), либо t строки (python>=3.14):
    text5 = t"[^a-z]{var}"
    print(re.sub(text5, "", text)) # ab
    Ответ написан
    Комментировать
  • Как указать модификатор S в re.sub python?

    Maksim_64
    @Maksim_64
    Data Analyst
    показал, бы что именно не сработало, ошибка или нет желаемого результата.

    Напрмер,
    re.findall(pattern, string, flags=0)

    re.sub(pattern, repl, string, count=0, flags=0)

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

    @rPman
    У тебя следующие задачи, которые решать придется по разному:
    * детектирование включения машины
    решается простой фиктивной службой systemd startup
    * детектирование выключения машины
    можно конечно тоже службой shutdown, но будут события только корректных выключений, а принудительные перезагрузки резетом или например ctrl+alt+shift+pause .. r (которая работает даже если модули ядра повиснут), не отловит.
    Тут можно поставить скрипт, анализирующий работу машины на соседнюю в сети, вариантов тьма.
    * попытки входа в систему
    В общем случае это в /var/log/auth.log там будет все, и использование sudo/su, и запуск процессов cron и служб (с указанием пользователя) и ssh подключения и тьма тьмущая всего что так или иначе затрагивает авторизацию, что и является 'вход в систему', там же можно посмотреть что пишет lightdm на попытки входа в gui

    Мониторить попытки входа придется скриптом, периодически читающим файл (осторожно tail -f /var/log/auth.log | my_script не отследит ротацию логов, поэтому лучше самому следить за датой последнего изменения файла и читать его с позиции, на которой остановился в прошлый раз ну или с нуля)
    upd. век живи век учись, ключ tail -F корректно будет работать с ротацией логов

    Если делать 'по феншую', то лучше работать с подсистемой сбора событий, в python с помощью python-systemd - journal например фильтруя по _SYSTEMD_UNIT=sshd.service и _COMM=sshd (сам я не делал, посмотрел что можно и в памяти отложил, сейчас ИИ спросил, да где то так и надо)

    * отправка сообщений в telegram
    можно конечно использовать какую-нибудь библиотеку, многословно, красиво... а можно отправить один http запрос по api telegram, кода минимум, наверное все так в своих скриптах делают
    https://api.telegram.org/bot<TOKEN>/sendMessage?chat_id=<CHAT_ID>&text=Hello%20World
    Ответ написан
    5 комментариев
  • Как можно ускорить выполнение этого кода?

    ZERGeich
    @ZERGeich
    Совет на будущее: насчёт идеальности кода - это ваше оценочное суждение и не надо его вставлять в вопрос, если вы хотите получить хоть какой-то дельный ответ.

    from collections import Counter
    задание = "АРОКСИЛИРОВАНИЕ".lower()
    длина = 7
    
    counter_задание = Counter(задание)
    
    with open('D:\\Program Files\\Text\\слова\\1.txt', 'r') as f:
        filtered_words = (word.strip() for word in f if длина <= len(word.strip()) <= len(задание))
        результат = [word for word in filtered_words if Counter(word) <= counter_задание]
    Ответ написан
    5 комментариев
  • Как правильно вывести результат регулярного выражения в Python?

    Maksim_64
    @Maksim_64
    Data Analyst
    Так если ищем паттерн в твоем случае (букву, для поиска буквы регулярка не нужна) в строке, почему match? Замени re.match на re.search, код отработает, но тут опять таки, если он ничего не найдет, то также будет none, добавь условие какое нибудь, например.

    import re
    a = 'samsung'
    b = re.search(r'u', a)
    if b:
        print(b)
        print(b.start())
        print(b.end())
    else:
        print('Паттерн не найден')
    Ответ написан
    7 комментариев
  • Сборка python файла с расширением pyw в exe файл??

    @Drno
    слишком длинный путь к файлу - ограничение обычно 255 символов
    а вообще - надо размещать проекты без кирилицы в путях, без пробелов и называть на англицком
    Ответ написан
    6 комментариев