Оптимизация в Python - страница 14

Шрифт
Интервал


Давайте рассмотрим пример применения модуля `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)

print(f"Поиск с использованием itertools занял {itertools_time:.6f} секунд")

```

Этот код измеряет время выполнения операции поиска пересечения между двумя списками с использованием цикла и с использованием `itertools`. Здесь мы используем функцию `itertools.filterfalse`, чтобы найти элементы, которые присутствуют в `list1`, но отсутствуют в `list2`. Мы выполняем каждую операцию поиска 100 раз и выводим результаты.

Вы увидите, что операция поиска с использованием `itertools` обычно выполняется быстрее, чем операция с использованием цикла, что позволяет улучшить производительность кода при работе с большими данными.


4. Модуль `functools`

Модуль `functools` в Python предоставляет полезные функции для оптимизации работы с функциями. Одной из наиболее важных функций этого модуля является `lru_cache`, которая позволяет кешировать результаты функций. Это может существенно повысить производительность функций, вызываемых многократно с одними и теми же аргументами.

Разберем пример использования `lru_cache` для оптимизации функции, вычисляющей факториал числа:

```python

import functools

# Декорируем функцию с lru_cache для кеширования результатов