Рубрики
Без рубрики

Python: DECE VS. Список

Знаете ли вы, как отслеживать последние пять точек данных во время некоторой обработки вместо … с меткой Python, DECE, список.

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

Сегодня я собираюсь поделиться с вами всем, как использовать Дейко от Коллекции Стандартный библиотечный модуль. Во-первых, мы охватим некоторые основы, а затем перейти к решению проблем. Надеюсь, вы наслаждаетесь моим постом! Если вы сделаете, пожалуйста, не забудьте понравиться:)

Что такое уклад?

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

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

Как видите, DEQUES являются своего рома обобщения стеков и очередей, но, чтобы увидеть, что на практике на практике на практике мы должны сравнивать их со списками, поэтому мы больше не будем говорить о стеках и очередях. Чтобы получить контраст между двумя «соперниками», мы собираемся более внимательно посмотреть в том, как они реализуются под капотом.

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

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

Список DECE VS.

Это приводит к следующим различиям в производительности:

Во-первых, RealLocation позволяет легко получать доступ к элементам почти немедленно по индексации. Используя Обозначение Big-O его можно измерить как O (1).

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

O (1) означает, что это берет постоянное время Для доступа к данным независимо от того, сколько элементов там. O (n) означает, что более элементы удерживают структуру, тем дольше требуется, чтобы найти ее. Таким образом, алгоритм O (1) быстрее, чем O (n).

В нашей ситуации DECE не выполняет перераспределение и найти элемент по индексу, внутренне Python нужно будет повторять итерацию по поводу уд. Итак, если есть n Элементы в DECE, интерпретатор придется выполнять до n Операции в худшем случае (если элемент находится в самом конце). Для списков это всегда o (1).

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

Во-вторых, Поскольку Deques реализуются в виде двойных массивов, у них есть преимущество при добавлении или появлении как справа, так и левой стороны декабря (измеряется как O (1)).

Это происходит, потому что внутринально только указатели должны быть исправлены, чтобы вставить новый узел в заданную позицию. Он работает только для окончания сторон, потому что где угодно, интерпретатор придется итерации по поводу декабря, и он будет (n) время вместо O (1).

Напротив, списки не имеют этой роскоши. Из-за перераспределения, делать то же самое, может принимать столько же, сколько операций O (n). Что ж, фактически, списки поддерживают быструю добавку и операции POP (измерейте как O (1)), но только в конце.

Более того, изменения в списке вызывают процесс перераспределения, который занимает дополнительное время самостоятельно, а приложение DECE и POP – последовательный , потому что это никогда не использует перераспределение.

Так , когда вам нужно добавлять или удалять элементы из «головы» или «хвоста», используйте Deques.

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

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

Также следует упомянуть, что Dequess – это безрезультатно для добавления и выпрызги от противоположных сторон , потому что Добавить () , appendleft () , поп () , Popleft () Методы атомные в CPYthon.

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

Маленький чит-лист, который поможет вам запомнить разницу производительности между Deques и списками:

Подвести итоги выше,

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

РЕШЕНИЕ ПРОБЛЕМ

Теперь давайте пройдем пару примеров, чтобы увидеть, как все это работает. Я бы подробно объяснил интерфейс декабря, потому что это вполне похоже на то, что вы делали со списками, и он очень хорошо выложен в Коллекции Документация.

Tracing последние транзакции

Во многих приложениях вы, вероятно, видели что-то вроде «Последние визиты», «предыдущие песни», «Последние статьи». Теперь давайте посмотрим, как мы можем легко сохранить историю х Последние операции пользователей с DECE.

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

from collections import deque
from random import randint

ts_all = []  # to keep all transactions
ts_history = deque(maxlen=10)  # to keep only the latest
for i in range(30):
    ts_sum = randint(1, 10000)  # random transaction sum
    record = f'Transaction sum: {ts_sum} dollars.'
    ts_all.append(record)  # store the record in a list
    ts_history.append(record)  # store the record in a deque

# Let's print our transactions from the deque:
for ts in ts_history:
    print(ts)

# Now, make sure if our deque transactions match
# ten last transactions in the list:
assert list(ts_history) == ts_all[-10:]

Переводчик не бросает ошибку, поэтому мы видим, что мы поняли это правильно.

Найти текстовый узор с некоторым предыдущим контекстом

Предположим, нам нужно найти шаблон в текстовом файле и предоставить ему какой-то предыдущий контекст (пару строк будет делать). В моем коде я использовал «Приключения Шерлока Холмса» в формате .txt, который вы можете скачать здесь для ваших собственных экспериментов. Где-то в тексте я положил фразу «Гарри Поттер был там!» Какой узор мы собираемся искать:)

Мы все готовы идти:

from collections import deque

def search(text: 'IO', pattern: str, maxlen= 4):
    previous_lines = deque(maxlen=maxlen)
    for line in text:
        if pattern in line:
            yield line, previous_lines
        else:
            previous_lines.append(line)

if __name__ == '__main__':
    with open('Sherlock Holmes.txt', 'r') as file:
        pattern = 'Harry Potter was there!'
        for line, previous_lines in search(file, pattern):
            for item in previous_lines:
                print(item, end='')  # suppress extra new lines
            print(line)

После запуска скрипта мы получим:

somewhere. I lay listening with all my ears. Suddenly, to my
horror, there was a distinct sound of footsteps moving softly in
the next room. I slipped out of bed, all palpitating with fear,
and peeped round the corner of my dressing-room door.
...Harry Potter was there!

Я нашел хорошее место, чтобы поставить мою фразу Гарри Поттера и испортить атмосферу Ужаса Конана Дойла, работал так сильно:)

Вернуть N Последние строки файла

Теперь, как в последнем примере, давайте посмотрим, как получить последнее n линии из файла. Я буду пытать наш файл Шерлока Холмса снова:)

from collections import deque

def tail(filename, n=6):
    'Return the last n lines of a file'
    with open(filename) as f:
        return deque(f, n)

if __name__ == '__main__':
    filename = 'Sherlock Holmes.txt'
    last_lines = tail(filename)
    for line in last_lines:
        print(line, end='')

После выполнения мы получим три строки, если мы используем бедных Шерлока Холмса. Да, мы попросили шесть, но мы подавляли пустые строки с Печать (линия,) :

interest in her when once she had ceased to be the centre of one
of his problems, and she is now the head of a private school at
Walsall, where I believe that she has met with considerable success.

РЕЗЮМЕ

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

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

Оригинал: “https://dev.to/v_it_aly/python-deque-vs-listwh-25i9”