Skip to main content

numba-jit-acceleration

Use al acelerar código numérico Python con Numba JIT.

소스 정보

저장소
Ntizar/MasterMind
최근 소스 활동
2026년 8월 31일 22:05
감지된 SKILL.md 언어
스페인어
스타
2
포크
0

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
numba-jit-acceleration
version
1.0.0
description
Use al acelerar código numérico Python con Numba JIT.
tags
["python","jit","compiler","numpy","performance","cuda","parallel","llvm"]
# Numba — Aceleración JIT de código numérico Python ## Resumen Numba (11.1k⭐, BSD-2, mantenido por Anaconda) es un compilador Just-In-Time que traduce un subconjunto de Python numérico (con NumPy) a máquina nativa vía LLVM. Acelera bucles y cálculo numérico 10-1000x sin salir de Python ni escribir C. **Cuándo usarlo:** simulaciones Monte Carlo, física/cálculos por píxel, procesamiento de nubes de puntos (LiDAR), sombras solares, estadística sobre arrays grandes — todo lo CPU-bound en los proyectos de datos de David. ## Instalación ```bash pip install numba # Versiones de numba están casadas con versiones de Python y NumPy: # comprobar tabla de compatibilidad si hay ImportError tras actualizar numpy ``` ## Patrones principales ### 1. Compilar una función (`@njit`) ```python from numba import njit import numpy as np @njit(fastmath=True) # fastmath: reordena ops flotantes (más rápido, menos estricto) def shadow_loop(sun_az, sun_el, grid): n = grid.shape[0] out = np.zeros(n) for i in range(n): out[i] = grid[i] * np.sin(sun_el) / np.tan(np.radians(sun_az + i)) return out ``` - `@njit` = `@jit(nopython=True)`: si la función usa algo no soportado, **falla en tiempo de compilación** en vez de degradar a modo object lento. Siempre njit, nunca jit pelado. - Primera llamada compila (~0.1-1s). Para producción: `cache=True`. ### 2. Paralelizar bucles (`parallel=True` + `prange`) ```python from numba import prange @njit(parallel=True) def pairwise_distances(X, Y): n, m = X.shape[0], Y.shape[0] D = np.empty((n, m)) for i in prange(n): # prange, NO range for j in range(m): D[i, j] = np.sqrt(((X[i] - Y[j]) ** 2).sum()) return D ``` - Usa `prange` para el bucle exterior independiente. `NUMBA_NUM_THREADS` limita hilos. - Reducciones (sumas, máx) soportadas; escrituras con índice derivado del bucle (`out[i] = ...`) soportadas; escrituras aleatorias = race condition. ### 3. UFuncs personalizados (`@vectorize` / `@guvectorize`) ```python from numba import vectorize, int64 @vectorize([int64(int64, int64)]) def gcd(a, b): while b: a, b = b, a % b return a gcd(np.array([12, 18]), np.array([8, 24])) # funciona con broadcasting como ufunc NumPy ``` ### 4. GPU CUDA ```python from numba import cuda @cuda.jit def add_kernel(a, b, out): i = cuda.grid(1) if i < a.size: out[i] = a[i] + b[i] d_a = cuda.to_device(a); d_out = cuda.device_array_like(a) add_kernel[blocks, threads_per_block](d_a, d_b, d_out) ``` - Requiere NVIDIA GPU + driver CUDA. `@cuda.jit` no compila si hay objeto no soportado: mismo principio nopython. - Alternativa más simple sin escribir kernels: `@jit(target_backend='cuda')` para bucles paralelizables. ## Pitfalls - **No soporta casi nada del ecosistema:** nada de pandas, dicts heterogéneos, funciones lambda dentro, atributos de objetos arbitrarios. Solo NumPy, scalars, tuplas/listas homogéneas, arrays tipados. - **`np.linalg` limitado**: `np.dot` sí; `svd`/`lstsq` solo en versiones recientes y con restricciones. - **Compilación por signatura**: cada combinación de tipos de argumentos compila una variante. Pasar arrays no-contiguos (`A.T`) cambia la signatura y recompila → usar `np.ascontiguousarray`. - **fastmath=True rompe IEEE**: `0*inf` y comparaciones con NaN pueden cambiar de resultado. - **NumPy 2.x**: numba antiguos (<0.59) reventaban con numpy≥2. Actualizar numba si se actualiza numpy. - **Medir siempre**: `time.perf_counter()` sobre 2ª llamada (la primera paga la compilación), o warmup antes de cronometrar. ## Verificación ```bash python -c "import numba, numpy as np; from numba import njit; f = njit(lambda x: x.sum()); print('OK', f(np.arange(1000)), numba.__version__)" ``` ## Cuándo NO usar Numba - Código I/O-bound o con pandas en el hot path → vectorizar primero con NumPy/pandas. - Necesitas depuración interactiva → separar el kernel numérico en su propia función `@njit`. - Cálculo con tipos arbitrarios/objetos → Cython o Python puro. ## Referencia - Repo: https://github.com/numba/numba - Docs: https://numba.readthedocs.io/en/stable/ - Examples: https://github.com/numba/numba-examples (notebooks en Binder)
GitHub에서 보기