Оптимизация в Python. Джейд Картер

Оптимизация в Python - Джейд Картер


Скачать книгу
`collections`

      Модуль `collections` в Python предоставляет дополнительные структуры данных, которые могут быть очень полезными при разработке различных алгоритмов. Рассмотрим несколько ключевых структур данных, доступных в этом модуле:

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

      – `deque`: Двусторонняя очередь (double-ended queue) предоставляет эффективные операции добавления и удаления элементов с обоих концов очереди. Это полезно, например, для реализации структур данных, таких как стеки и очереди.

      – `Counter`: Этот класс позволяет подсчитывать количество элементов в итерируемом объекте и предоставляет удобный способ анализа данных. Он может быть использован для подсчета повторяющихся элементов в последовательности.

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

      Выбор подходящей структуры данных из модуля `collections` может существенно повысить производительность ваших алгоритмов и сделать код более читаемым и поддерживаемым. Вот краткий пример использования `namedtuple`:

      ```python

      from collections import namedtuple

      # Определение именованного кортежа "Person"

      Person = namedtuple('Person', ['name', 'age', 'city'])

      # Создание экземпляра именованного кортежа

      person1 = Person(name='Alice', age=30, city='New York')

      person2 = Person(name='Bob', age=25, city='San Francisco')

      # Доступ к полям по имени

      print(person1.name) # Вывод: Alice

      print(person2.city) # Вывод: San Francisco

      ```

      Этот пример показывает, как можно использовать `namedtuple` для создания структурированных данных. По аналогии, другие классы из модуля `collections` также могут значительно улучшить работу с данными и оптимизировать ваши алгоритмы.

      Измерение производительности кода можно быть важной частью оптимизации программы. Для этого можно использовать модуль `timeit`, который позволяет измерять время выполнения кода. Рассмотрим еще один пример измерения производительности при использовании `deque` из модуля `collections` в сравнении с обычным списком:

      ```python

      import timeit

      from collections import deque

      # Создадим больой список

      big_list = list(range(1000000))

      # Измерим время выполнения операции добавления элемента в начало списка

      def list_insert():

      big_list.insert(0, 999)

      # Измерим время выполнения операции добавления элемента в начало двусторонней очереди

      def deque_appendleft():

      dq = deque(big_list)

      dq.appendleft(999)

      # Измерим время выполнения для списка

      list_time = timeit.timeit(list_insert, number=1000)

      print(f"Добавление в начало списка заняло {list_time:.6f} секунд")

      # Измерим время выполнения для двусторонней очереди

      deque_time = timeit.timeit(deque_appendleft, number=1000)

      print(f"Добавление в начало двусторонней очереди заняло {deque_time:.6f} секунд")

      ```

      Этот код измеряет время выполнения операции добавления элемента в начало списка и двусторонней очереди по 1000 раз и выводит результат. Вы увидите, что двусторонняя очередь (`deque`) значительно эффективнее при таких операциях, потому что она оптимизирована для добавления и удаления элементов в начале и конце.

      Результат будет зависеть


Скачать книгу