Эффективность Python: списки против кортежей

У меня среднее количество базовых объектов.

Эти базовые объекты будут помещены в коллекции, и эти коллекции будут разбиты вокруг: отсортированы, усечены и т. Д.

К сожалению, n достаточно велико, чтобы потребление памяти было немного тревожным, и скорость поступает.

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

Во всяком случае, я хотел бы знать, какие компиляции cpu / memory списков или кортежей находятся в Python 2.6 / 2.7.

7 Solutions collect form web for “Эффективность Python: списки против кортежей”

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

ОБНОВЛЕНИЕ: подумав над этим, вы можете захотеть взглянуть на оптимизацию использования пространства ваших объектов, например, через __slots__ или использовать экземпляры namedtuple качестве прокси вместо реальных объектов. Это, скорее всего, приведет к значительно большему сбережению, так как у вас есть N и (предположительно) только несколько коллекций, в которых они появляются. namedtuple в особенности супер удивительный; посмотрите разговор Раймонда Хеттингера .

Как отмечали другие кортежи, они неизменны. Сортировка кортежа (например, sorted(mytuple) ) возвращает список, который вам нужно будет вернуть обратно в кортеж.

Чтобы отсортировать кортеж (и сохранить его в кортеже), вам нужно будет сделать это:

 mytuple = (3,2,1) mysortedtuple = tuple(sorted(mytuple)) 

Чтобы отсортировать список, вам нужно будет сделать это:

 mylist = [3,2,1] mylist.sort() 

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

Не зацикливайтесь на использовании кортежей над списками, если у вас нет хорошего оправдания. Если вам нужны отсортированные данные, кортежи не подходят, если они не созданы таким образом, в первую очередь. Кортежи превосходят, когда данные, которые они содержат, НЕ ИЗМЕНЯЮТ, например, с настройками конфигурации, которые загружаются во время выполнения, или данными, которые уже были обработаны.

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

Дальнейшее чтение:

  • Python's itertools
  • Функциональное программирование Python HOWTO

Каково (среднее, минимальное, максимальное) количество базовых объектов в коллекции?

Кортежи «дедуплицируются», а списки – нет? Как вы думаете, что «дедуплицированный» означает в этом контексте?

Списки занимают больше памяти, чем кортежи, потому что дополнительная память выделяется при презумпции того, что список будет расти, и вы определенно не хотите переименовывать () память каждый раз, когда вы делаете large_list.append (). Однако на 32-битной машине амортизированная стоимость дополнительного элемента списка составляет 4 байта для указателя, N байтов для самого элемента и не более 4 байтов для дополнительной памяти. N – 16 байтов для поплавка. Это означает, что список float занимает до 24 байтов на каждый дополнительный float, по сравнению с 20 байтами для кортежа. «Базовый объект» с N == 100 дает сравнение 108 против 104. Если базовый объект упоминается в двух коллекциях, то 58 против 54. Насколько велика ваша N?

Совет. Оставьте свои коллекции в виде списков. Сконцентрироваться на:

  • гарантируя, что ваши базовые объекты эффективны с точки зрения памяти

  • использовать генераторы и альтернативы itertools вместо временных списков, где это возможно

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

В дополнение ко всем этим предложениям вы можете обнаружить, что numpy заполнит ваши потребности. Если ваши объекты – это то, что по умолчанию имеет числовые дескрипторы (ints, native C types и т. Д.), Тогда это было бы идеально. Вы можете использовать массив numpy с настраиваемыми объектами, но это может быть больше работы, чем это стоит.

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

Вы не можете сортировать неизменяемый объект, т. Е. При сортировке кортежа вы всегда создадите новый.

Есть как минимум два существующих вопроса, которые достаточно похожи на ваши, что ответы (или ссылки внутри них) могут быть вам полезны. Подводя итог: пусть характеристики типа (изменчивые против неизменного, гетерогенного или однородного), а не производительность, определяют ваше решение, поскольку различия в производительности / эффективности минимальны.

В чем разница между списком и кортежами в Python?
В чем разница между списком, словарем и кортежем в Python?

  • Анализ текста для удаления собственных существительных и содержимого электронной почты в Python
  • Python Variable "resetting"
  • tkinter LabelFrame не поддерживает виджетов
  • кодирование / декодирование строки python
  • Openpyxl заполняет соседние ячейки
  • Войдите на сайт, используя модуль Python Requests
  • Как я могу подсчитать появление каждого слова в документе, используя понимание словаря
  • TypeError: объект 'int' не вызываем ,,, len ()
  • Удаление столбцов в фрейме данных
  • Динамический выбор адаптера в зависимости от установленной библиотеки (ов)
  • Проверьте, находится ли строка в кадре данных pandas
  • Python - лучший язык программирования в мире.