#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Mar  3 22:44:07 2026

@author: scige
"""

import numpy as np
import time
from numba import jit

# 1. Funzione in Python standard (Lenta)
def py_sum_squares(a):
    res = 0.0
    for x in a:
        res += x**2
    return res

# 2. Funzione con Numba (Velocissima dopo la prima esecuzione)
# @jit(nopython=True) trasforma il codice in linguaggio macchina
@jit(nopython=True)
def numba_sum_squares(a):
    res = 0.0
    for x in a:
        res += x**2
    return res

# Creiamo un array di 10 milioni di elementi
data = np.random.random(10_000_000)

# --- TEST DI VELOCITÀ ---

# Python Standard
start = time.time()
py_sum_squares(data)
print(f"Python standard: {time.time() - start:.4f} secondi")

# NumPy (Vettorizzato)
start = time.time()
np.sum(data**2)
print(f"NumPy:           {time.time() - start:.4f} secondi")

# Numba (Compilazione + Esecuzione)
# La prima volta è più lenta perché deve compilare
numba_sum_squares(data) 

# Numba (Solo Esecuzione - Seconda volta)
start = time.time()
numba_sum_squares(data)
print(f"Numba:           {time.time() - start:.4f} secondi")
