Если вам знакома ситуация, когда NumPy перестает справляться, а писать расширения на C++ или Rust вручную слишком долго, обратите внимание на ironkernel. Это библиотека, которая позволяет писать выражения на Python (DSL), а исполнять их параллельно на Rust через движок Rayon.
Проект объединяет два мира:
1. Python DSL: Вы пишете привычный код с использованием декораторов или выражений.
2. Rust Engine: Код компилируется в промежуточное представление (IR), после чего Python отпускает GIL, и Rust задействует все ядра процессора для вычислений.
Самый простой способ — использовать декоратор
@kernel.elementwise. Он превращает обычную функцию в параллельный кернел:
import numpy as np
from ironkernel import kernel, rt
@kernel.elementwise
def saxpy(a, x, y):
return a * x + y
# Подготовка данных
bx = rt.asarray(np.arange(1_000_000, dtype=np.float64))
by = rt.asarray(np.ones(1_000_000, dtype=np.float64))
# Запуск в Rust-рантайме (GIL отпущен!)
task = rt.go(kernel.map(saxpy, a=2.0, x=bx, y=by))
result = task.result().numpy()
Авторы пошли дальше и внедрили в Python каналы в стиле Go (`chan` и `select`). Это позволяет строить конвейеры данных, где результат одной задачи передается в другую без лишних блокировок.
out_ch = chan(4)
# Результат вычисления сразу летит в канал
rt.go(kernel.map(double, x=src), out=out_ch)
buf = out_ch.recv() # Получаем данные асинхронно
🔗 Ссылка на проект
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
