2015-04-20 8 views
27

Ich habe einen Satz von n Vektoren in der 3 x n Matrix z gespeichert. Ich finde das äußere Produkt mit np.einsum. Als ich timed es mit:Was bedeutet "ein Zwischenergebnis wird zwischengespeichert"?

%timeit v=np.einsum('i...,j...->ij...',z,z) 

bekam ich das Ergebnis:

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 

Was hier geschieht, und kann vermieden werden? Die beste 3 ist 2.9us, aber die langsamste vielleicht typischer.

+4

Versuchen Sie zu Testzwecken, die Größe 'n' zu erhöhen, dies reduziert den Bruchteil von' z', der im Cache Ihrer CPU gespeichert ist, und die Meldung sollte irgendwann verschwinden –

Antwort

24

Die Nachricht "Zwischenergebnis wird zwischengespeichert" ist nur eine blinde Schätzung in der vordefinierten Nachricht, die von% timeit gemeldet wurde. Es kann sein oder nicht, und Sie sollten nicht davon ausgehen, dass es korrekt ist.

Insbesondere ist einer der häufigsten Gründe für den ersten Lauf, der am langsamsten ist, dass das Array erst nach dem ersten Lauf in der CPU cache ist.

CPUs Cache Dinge automatisch; Du kannst das nicht vermeiden und du willst es nicht wirklich vermeiden. Optimierungsalgorithmen, so dass CPU-Caches optimal arbeiten können, gehören heutzutage zu den Engpässen, die bei der Hochleistungsverarbeitung berücksichtigt werden müssen.