2016-05-24 10 views
7

Ich erzeuge eine große Matrix (100x100, nennen wir es X) mit Zufallszahlen, mit numpy.matrix(), so dass ich eine numpy.darray habe.Unterschiede der Transponierungsfunktionen in Python

Ich habe mich gefragt, ob es einen Unterschied zwischen den beiden Operationen sind:

  1. numpy.transpose (X)
  2. XT

I die Zeit gemessen wurden jede Operation in einer Schleife mit einer Reichweite von 1000 und es scheint, dass XT ist deutlich schneller als numpy.transpose (X)

Added Benchmarks:

Für eine 100x100-Matrix Ich habe die folgenden Ergebnisse mit XT und numpy.tranpose (X)

In einer 10.000-Bereichsschleife:

  • 7421/10.000: XT schnellste
  • 1256/10,000: numpy.transpose (X) schnellste
  • 1323/10,000: Der gleiche Rechenzeit oder die Differenz zu klein, um
  • zu bestimmen

Hinzugefügt wurde die Code unten

import numpy as np 
    import time 

    np_transpose_count = 0 
    T_transpose_count = 0 
    equal_count = 0 

    for i in range(10000): 
     Se = np.random.rand(100,100) 

     tic1 =time.clock() 
     ST_T = Se.T 
     toc1=time.clock() 

     tic2 =time.clock() 
     ST_np = np.transpose(Se) 
     toc2=time.clock() 

     if (toc1-tic1) < (toc2-tic2): 
      T_transpose_count+=1 
     elif (toc1-tic1) > (toc2-tic2): 
      np_transpose_count+=1 
     else: 
      equal_count+=1 

    print(T_transpose_count, np_transpose_count, equal_count) 

Mit freundlichen Grüßen Whir

+0

Interessant. Ich verstehe die Einheiten Ihres Benchmarks nicht. Können Sie aktualisieren, um zu sagen? Auf meinem System sieht es so aus, als ob X.T 20-30% schneller ist als X.transpose() (mit% timeit auf 100x100 oder 10000x10000 Array). – user20160

+2

Auch "np.transpose (X)" ist 120-130% langsamer als "x.T" auf meinem System. Vielleicht gibt es eine kleine Menge zusätzlichen Aufwands für den Funktionsaufruf ('x.transpose()' ist eine Funktion, während 'x.T' nicht ist). 'np.transpose()' ist eine Python-Funktion mit etwas Wrapping-Code, daher gibt es dort zusätzlichen Overhead. – user20160

Antwort

5

IPython %timeit Magie erhalte ich:

In [218]: X=np.ones((100,100)) 

In [219]: timeit X.T 
1000000 loops, best of 3: 379 ns per loop 

In [220]: timeit X.transpose() 
1000000 loops, best of 3: 470 ns per loop 

In [221]: timeit np.transpose(X) 
1000000 loops, best of 3: 993 ns per loop 

In [222]: timeit X+1 
10000 loops, best of 3: 21.6 µs per loop 

Also ja, .T ist am schnellsten, und die Funktion langsamsten. Aber vergleichen diese Zeiten mit der Zeit für eine einfache Addition

oder eine Kopie oder Scheibe

In [223]: timeit X.copy() 
100000 loops, best of 3: 10.8 µs per loop 

In [224]: timeit X[:] 
1000000 loops, best of 3: 465 ns per loop 

Transponieren in all seinen Formen gibt ein neues Array-Objekt, mit neuen shape und strides, aber mit einem gemeinsamen Datenpuffer (Sehen Sie sich das .__array_interface__ Wörterbuch an, um das zu sehen). Es dauert also ungefähr die gleiche Zeit wie andere Aktionen, die eine view zurückgeben. Aber keine der Transponierungsfunktionen erstellt eine Kopie der Daten oder iteriert sie. Die Zeitunterschiede sind also nur das Ergebnis eines Anrufs über den Kopf.

Wieder mit ipython Magie

np.transpose?? 
def transpose(a, axes=None): 
    try: 
     transpose = a.transpose 
    except AttributeError: 
     return _wrapit(a, 'transpose', axes) 
    return transpose(axes) 

So endet np.function(X)X.transpose() aufrufen.

Ich müsste den numpy Code betrachten, aber ich erinnere mich, dass .T als attribute (nicht ganz das gleiche wie ein property) implementiert ist. Ich vermute, dass es schneller ist, weil es nicht den Parameter axes verwendet, und speichert daher einen Funktionsaufruf C oder zwei.

+0

Vielen Dank für Ihre ausführliche Antwort. Es war sehr nützlich für mein Verständnis davon. – Whir

Verwandte Themen