2015-05-27 17 views
5

Ho numpy compilato con OpenBlas e mi chiedo perché einsum sia molto più lento del punto (capisco nel caso dei 3 indici, ma non capisco perché sia ​​anche meno performante nel caso dei due indici)? Ecco un esempio:Perché numpy.dot è molto più veloce di numpy.einsum?

import numpy as np 
A = np.random.random([1000,1000]) 
B = np.random.random([1000,1000]) 

%timeit np.dot(A,B) 

Out: 10 loops, best of 3: 26.3 ms per loop 

%timeit np.einsum("ij,jk",A,B) 

Out: 5 loops, best of 3: 477 ms per loop 

C'è un modo per far OpenBlas uso einsum e parallelizzazione come numpy.dot? Perché np.einsum non chiama semplicemente np.dot se nota un prodotto con punti?

+0

Correlato: http://stackoverflow.com/questions/20149201/why-is-numpys-einsum-slower-than-numpys-built-in-functions –

+0

Questo è vero, ma la mia domanda è piuttosto correlata ai due indici Astuccio. Le risposte nel post specificato mi danno l'impressione che ci siano problemi con tre indici. Sono stato sorpreso che la differenza di velocità in questo specifico esemplare sia così impressionante. – varantir

+3

Poiché l'einsum è scritto per essere generico e non è un caso speciale, il prodotto con due punti indice è usato da blas. Questa è davvero la linea di fondo. Se sai che hai solo due indici, usa il punto. – BeRecursive

risposta

2

einsum analizza la stringa di indice e quindi costruisce un oggetto nditer e lo utilizza per eseguire un'iterazione di somma di prodotti. Ha casi speciali in cui gli indici eseguono solo gli scambi di assi e le somme ('ii-> i'). Può anche avere casi speciali per 2 e 3 variabili (al contrario di più). Ma non fa alcun tentativo di invocare librerie esterne.

Ho elaborato un puro pitone simile a un lavoro, ma con maggiore attenzione al parsing rispetto ai casi speciali di calcolo.

tensordot rimodellamento e scambio, quindi è possibile chiamare dot ai calcoli effettivi.