logo
LIS PUBLICA
☰
  • Новое
  • Горячее
  • Сокровищница
  • Лучшее
  • Обсуждаемое

Python

  • Игнорировать
  • Подписаться

ne_takoi
ne_takoi Опубликовано 2 месяца назад
  • Python
  • Гололед

Что такое векторизация?

Векторизация — это процесс замены явных циклов на операции над целыми массивами данных. Вместо обработки элементов по одному, мы применяем операции сразу ко всему массиву.

Пример: Сравнение подходов

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, позволяющая достичь ускорения в десятки и сотни раз!

Читать дальше...
3
+3 / -0
14
22
Войти

Вход

Регистрация

Я не помню пароль

Войти через Google
Порог горячего 6
Правила сайта
Пользовательское соглашение
О ПД
Принципы самоуправления
©2025 Varius Soft