Что такое векторизация?
Векторизация — это процесс замены явных циклов на операции над целыми массивами данных. Вместо обработки элементов по одному, мы применяем операции сразу ко всему массиву.
Пример: Сравнение подходов
1. Медленный способ: Цикл for
import numpy as np
import time
# Исходная функция для одного элемента
def my_func(x):
return x**2 + np.sin(x)
# Создаем массив данных
data = np.random.rand(1000000)
# Медленный способ: цикл
start_time = time.time()
result_loop = np.empty_like(data)
for i in range(len(data)):
result_loop[i] = my_func(data[i])
loop_time = time.time() - start_time
print(f"Время выполнения цикла: {loop_time:.4f} секунд")
2. Быстрый способ: Векторизация
# Быстрый способ: векторизованные операции
start_time = time.time()
result_vectorized = data**2 + np.sin(data)
vectorized_time = time.time() - start_time
print(f"Время выполнения векторизации: {vectorized_time:.4f} секунд")
print(f"Ускорение в {loop_time/vectorized_time:.1f} раз!")
Когда векторизация действительно эффективна
1. Встроенные векторные операции NumPy
from numpy import vectorize
# vectorize - это просто удобный синтаксис, а не оптимизация
vectorized_func = vectorize(my_func)
start_time = time.time()
result_vectorize_wrapper = vectorized_func(data)
vectorize_wrapper_time = time.time() - start_time
print(f"np.vectorize() время: {vectorize_wrapper_time:.4f} секунд")
2. Использование broadcasting
# Broadcasting позволяет работать с массивами разных размеров
matrix = np.random.rand(1000, 1000)
vector = np.random.rand(1000)
# Каждая строка матрицы умножается на вектор
result = matrix * vector[:, np.newaxis]
3. Векторизация с Pandas
import pandas as pd
df = pd.DataFrame({
'A': np.random.rand(100000),
'B': np.random.rand(100000)
})
# Медленно: apply с lambda
df['C_slow'] = df.apply(lambda row: row['A']**2 + np.sin(row['B']), axis=1)
# Быстро: векторные операции
df['C_fast'] = df['A']**2 + np.sin(df['B'])
Практические рекомендации
1. Избегайте циклов там, где возможны векторные операции
2. Используйте встроенные функции NumPy/Pandas вместо кастомных
3. np.vectorize() используйте только для удобства, а не для производительности
4. Освойте broadcasting для работы с массивами разных размеров
5. Используйте компиляцию (Numba, Cython) если векторизация невозможна
# Пример с Numba для случаев, где векторизация сложна
from numba import jit
@jit(nopython=True)
def complex_calculation(arr):
result = np.empty_like(arr)
for i in range(len(arr)):
# Сложная логика, которую трудно векторизовать
result[i] = arr[i] * np.exp(-arr[i]**2)
return result
Векторизация — это фундаментальная концепция для высокопроизводительных вычислений в Python, позволяющая достичь ускорения в десятки и сотни раз!