Python: wann sind slice-Operationen an Arrays vorteilhaft?


19.12.2023, 20:08

Ich sehe gerade, dass wenn man die Arry-Größe um das hundertfache vergrößert, die Variante 2 tatsächlich schneller ist:

D:\python\animation>python test.py
used time for variant 1: 1.234086513519287
used time for variant 2: 0.03494548797607422
t1/t2: 35.31461670714734

Somit ist die Antwort scheinbar, dass der Overhead des slicings ab einer bestimmten Größe gegenüber der eigentlichen Rechnerei vernachlässigbar wird.

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet
Scheinbar kann man das aber nicht so einfach sagen. Wann sind slice Operationen schneller bzw. von Vorteil?

Bei Python-eigenen Datenstrukturen (wie Listen und Tupeln) fast immer.

Numpy ist halt...speziell. Das ist eine separate Library, die ohnehin großteils in C(++) implementiert wurde. Da ist die Slice-Notation vermutlich ein Wrapper rund um die "nativen" Funktionen von Numpy - wenn du die Zeit hast, schau dir den Sourcecode an.

paprikaw22 
Fragesteller
 19.12.2023, 20:10

Danke für die Antwort. Ich habe gerade festgestellt, dass sich der Vorteil der zweiten Methode bei großen Arrays bezahlt macht. Vergrößere ich die Eingangs-Arrays um das hundertfache, ist Variante 35 mal schneller ! Das habe ich nicht bedacht und ist schon gewaltig...

  scale = 100 # <<-- !!!

  f = np.array([
    [0,  0,  0,  0,  0,  0,   0] * scale, 
    [0,  1,  3,  6 , 4,  2,   0] * scale, 
    [0,  2,  4,  7 , 6,  4,   0] * scale,   
    [0,  0,  0,  0,  0,  0,   0] * scale
    ])
     
  u = np.array([
    [0,  0,  0,  0,  0,  0,   0] * scale, 
    [0,  0.5, 1,  0, -1, -0.5,  0] * scale, 
    [0,  0.7, 1.1, 0, -1, -0.4,  0] * scale, 
    [0,  0,  0,  0,  0,  0,   0] * scale, 
    ])
1
jo135  19.12.2023, 20:14
@paprikaw22

Interessant, das klingt aber auch plausibel. Bei "Methode 1" springst du ja ständig zwischen nativem Numpy und (tendenziell langsamem) Python hin und her. Im zweiten Fall kann das (bei entsprechender Implementierung) komplett innerhalb von Numpy abgehandelt werden.

Wenn man sich das API von Numpy so anschaut gibt es ja viele Funktionen, die genau das erreichen sollen, d.h. Operationen "internalisieren".

1
paprikaw22 
Fragesteller
 19.12.2023, 20:15
@jo135

ja, wieder mal was gelernt. Dass ich so viel rausschinden kann, hab ich mir nicht gedacht. Ein Faktor 2 hätte mir schon gereicht. Ich liebe Python :-)

D:\python\animation>python test.py
used time for variant 1: 12.936085939407349
used time for variant 2: 0.18498826026916504
t1/t2: 69.9292264308278
1