Mentre giocare con this question ho notato qualcosa che non potevo spiegare per quanto riguarda la performance relativa np.log2
, np.log
e np.log10
:Perché log2 e log1p sono molto più veloci di log e log10?
In [1]: %%timeit x = np.random.rand(100000)
....: np.log2(x)
....:
1000 loops, best of 3: 1.31 ms per loop
In [2]: %%timeit x = np.random.rand(100000)
np.log(x)
....:
100 loops, best of 3: 3.64 ms per loop
In [3]: %%timeit x = np.random.rand(100000)
np.log10(x)
....:
100 loops, best of 3: 3.93 ms per loop
np.log2
è circa 3 volte più veloce di np.log
e np.log10
. Forse ancor più contro-intuitivo, np.log1p(x)
, che calcola ln (x + 1), è alla pari con np.log2
:
In [4]: %%timeit x = np.random.rand(100000)
np.log1p(x)
....:
1000 loops, best of 3: 1.46 ms per loop
ho ottenuto quasi identiche in tempi v1.10.1 NumPy e v1.8.2.
Esiste una spiegazione intuitiva per queste discrepanze nelle prestazioni di runtime?
[questa risposta] (http://math.stackexchange.com/a/61236/277288) in matematica, SE sembra dire che alcuni metodi riducono con 'log2' per il calcolo di qualsiasi registro. questo può significare che l'implementazione delle funzioni di log di np dipende, in un modo o nell'altro, da log2 e/o ln (x + 1). Penso che questo abbia a che fare con la serie di Taylor di entrambi. –
Questa è un'osservazione molto interessante. Non sono affatto un esperto nell'implementazione a basso livello di routine di calcolo efficienti. Intuitivamente direi che questo ha a che fare con il fatto che tutti i logaritmi sono concettualmente correlati. Se ne conosci uno, in pratica li conosci tutti grazie a semplici trasformazioni. Quindi ad un certo punto devi decidere quale può essere calcolato in modo efficiente su un processore. Calcolare gli altri tramite la trasformazione richiederebbe ovviamente un po 'più di tempo. Ma mi piacerebbe vedere una risposta esperta qui. – cel
Forse poiché i dati binari sono di base 2, ci sono alcuni trucchi di ottimizzazione disponibili con log2 – wim