# Создадим больой список
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`) значительно эффективнее при таких операциях, потому что она оптимизирована для добавления и удаления элементов в начале и конце.
Результат будет зависеть от производительности вашей системы, но обычно вы увидите, что добавление элемента в начало `deque` будет выполняться намного быстрее, чем в обычном списке. `deque` оптимизирована для таких операций, и вы должны увидеть значительное ускорение по сравнению с обычным списком.
Измерение производительности поможет вам выбрать подходящую структуру данных или оптимизировать код для достижения лучшей производительности в вашем приложении.
3. Модуль `itertools`
Модуль `itertools` в Python предоставляет множество функций, которые упрощают создание и обработку итераторов. Это может быть очень полезным при работе с большими наборами данных и выполнении итераций. Далее некоторые из наиболее полезных функций из этого модуля:
– `itertools.count(start, step)`: Эта функция создает бесконечный итератор, который генерирует числа, начиная с `start` и увеличиваясь на `step` с каждой итерацией.
– `itertools.cycle(iterable)`: Создает бесконечный итератор, который бесконечно повторяет элементы из `iterable`.
– `itertools.repeat(elem, times)`: Создает итератор, который возвращает элемент `elem` `times` раз.
– `itertools.chain(iterable1, iterable2, …)`: Объединяет несколько итерируемых объектов в один длинный итератор.
– `itertools.islice(iterable, start, stop, step)`: Возвращает срез итерируемого объекта, начиная с `start` и заканчивая до `stop` с шагом `step`.
– `itertools.filterfalse(predicate, iterable)`: Возвращает элементы итерируемого объекта, для которых функция `predicate` возвращает `False`.
– `itertools.groupby(iterable, key)`: Группирует элементы из итерируемого объекта на основе функции `key`.
– `itertools.product(iterable1, iterable2, …)`: Возвращает декартово произведение нескольких итерируемых объектов.
Давайте рассмотрим пример применения модуля `itertools` для оптимизации и измерения производительности кода. Предположим, у нас есть два больших списка, и мы хотим найти пересечение (общие элементы) между ними. Мы можем использовать модуль `itertools` для этой задачи:
```python
import timeit
import itertools
# Создадим два больших списка
list1 = list(range(100000))
list2 = list(range(50000, 150000))
# Измерим время выполнения операции поиска пересечения с использованием цикла
def find_intersection_with_loop():
intersection = []
for item in list1:
if item in list2:
intersection.append(item)
# Измерим время выполнения операции поиска пересечения с использованием itertools
def find_intersection_with_itertools():
intersection = list(itertools.filterfalse(lambda x: x not in list2, list1))
# Измерим время выполнения для поиска с использованием цикла
loop_time = timeit.timeit(find_intersection_with_loop, number=100)
print(f"Поиск с использованием цикла занял {loop_time:.6f} секунд")
# Измерим время выполнения для поиска с использованием itertools
itertools_time = timeit.timeit(find_intersection_with_itertools, number=100)