diff --git a/pm2d/_jit_kernels.py b/pm2d/_jit_kernels.py index e06d5d1..e8ce0ee 100644 --- a/pm2d/_jit_kernels.py +++ b/pm2d/_jit_kernels.py @@ -246,10 +246,22 @@ def score_bitmap_rescored( return np.maximum(0.0, out).astype(np.float32) +_HAS_NP_BITCOUNT = hasattr(np, "bitwise_count") + + def popcount_density(spread: np.ndarray) -> np.ndarray: + """Conta bit set per pixel. + + Order: + 1) Numba JIT parallel (preferito: piu veloce su 1080p, 0.5ms vs 1.6ms) + 2) numpy.bitwise_count (NumPy 2.0+, SIMD ma single-thread) + 3) Fallback numpy bit-shift puro + """ + spread_c = np.ascontiguousarray(spread, dtype=np.uint8) if HAS_NUMBA: - return _jit_popcount_density(np.ascontiguousarray(spread, dtype=np.uint8)) - # Fallback + return _jit_popcount_density(spread_c) + if _HAS_NP_BITCOUNT: + return np.bitwise_count(spread_c).astype(np.float32, copy=False) H, W = spread.shape out = np.zeros((H, W), dtype=np.float32) for b in range(8):