python: сравнение производительности deque vs list

На самом деле, версии стандарта C ++ до того, как C ++ 11 определили ключевое слово «export», [] , можно просто объявить шаблоны в файле заголовка и реализовать их в другом месте.

К сожалению, ни один из популярных компиляторов не реализовал это ключевое слово. Единственный, о котором я знаю, - это интерфейс, написанный Edison Design Group, который используется компилятором Comeau C ++. Все остальные настаивали на том, что вы пишете шаблоны в заголовочных файлах, нуждающихся в определении кода для надлежащего создания экземпляра (как уже указывали другие).

В результате стандартная комиссия ISO C ++ решила удалить export особенность шаблонов, начинающихся с C ++ 11.

35
задан Raymond Hettinger 6 May 2014 в 06:53
поделиться

2 ответа

Я рекомендовал бы Вам относиться https://, списки wiki.python.org/moin/TimeComplexity

Python и двухсторонняя очередь имеют simlilar сложности для большинства операций (нажатие, появитесь и т.д.)

0
ответ дан 27 November 2019 в 06:38
поделиться

Я нашел свой путь к этому вопросу и думал, что предложу пример с небольшим контекстом.
пример использования классика А для использования Двухсторонней очереди мог бы вращаться/смещать элементы в наборе, потому что (поскольку другие упомянули), Вы становитесь очень хорошими (O (1)) сложность для операций нажатия/поп на обоих концах, потому что эти операции просто перемещают ссылки в противоположность списку, который должен физически переместить объекты в памяти.

, Таким образом, вот 2 очень подобно выглядящие реализации поворачивания - оставлен функцию:

def rotate_with_list(items, n):
    l = list(items)
    for _ in range(n):
        l.append(l.pop(0))
    return l

from collections import deque
def rotate_with_deque(items, n):
    d = deque(items)
    for _ in range(n):
        d.append(d.popleft())
    return d

Примечание: Это - такое общее использование двухсторонней очереди, что двухсторонняя очередь имеет встроенное rotate метод, но я делаю его вручную здесь ради визуального сравнения.

Теперь позволяют нам %timeit.

In [1]: def rotate_with_list(items, n):
   ...:     l = list(items)
   ...:     for _ in range(n):
   ...:         l.append(l.pop(0))
   ...:     return l
   ...: 
   ...: from collections import deque
   ...: def rotate_with_deque(items, n):
   ...:     d = deque(items)
   ...:     for _ in range(n):
   ...:         d.append(d.popleft())
   ...:     return d
   ...: 

In [2]: items = range(100000)

In [3]: %timeit rotate_with_list(items, 800)
100 loops, best of 3: 17.8 ms per loop

In [4]: %timeit rotate_with_deque(items, 800)
The slowest run took 5.89 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 527 µs per loop

In [5]: %timeit rotate_with_list(items, 8000)
10 loops, best of 3: 174 ms per loop

In [6]: %timeit rotate_with_deque(items, 8000)
The slowest run took 8.99 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 1.1 ms per loop

In [7]: more_items = range(10000000)

In [8]: %timeit rotate_with_list(more_items, 800)
1 loop, best of 3: 4.59 s per loop

In [9]: %timeit rotate_with_deque(more_items, 800)
10 loops, best of 3: 109 ms per loop

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

0
ответ дан 27 November 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: