Ho un set di n vettori memorizzati in 3 xn matrix z
. Trovo il prodotto esterno che utilizza np.einsum
. Quando l’ho cronometrato usando:
%timeit v=np.einsum('i...,j...->ij...',z,z)
Ho ottenuto il risultato:
The slowest run took 7.23 times longer than the fastest. This could mean that an intermediate result is being cached 100000 loops, best of 3: 2.9 µs per loop
Cosa sta succedendo qui e può essere evitato? Il miglior 3 è 2,9us, ma il più lento forse più tipico.
Il messaggio “il risultato intermedio viene memorizzato nella cache” è solo un’ipotesi cieca nel messaggio fisso riportato da% timeit. Potrebbe essere o non essere vero, e non dovresti dare per scontato che sia corretto.
In particolare, uno dei motivi più comuni per cui la prima esecuzione è più lenta è che l’array si trova nella cache della CPU solo dopo la prima esecuzione.
Le CPU nascondono automaticamente le cose; non puoi evitarlo, e non vuoi davvero evitarlo. Tuttavia, l’ottimizzazione degli algoritmi in modo che le cache della CPU possano funzionare in modo ottimale è al giorno d’oggi uno dei colli di bottiglia che l’elaborazione ad alte prestazioni deve tenere in considerazione.