2017-08-18 1 views
0

Ich bin verwirrt, warum test2 nicht schneller als test1 im folgenden Code ist:Sollte die Vorbelegung von Arrays in numpy nicht schneller sein?

import timeit 

setup = """ 
import numpy as np 
A = np.ones((220, 220, 220)) 
B = np.ones((220, 220, 220)) 

class store: 
    def __init__(self): 
     self.C = np.empty((220, 220, 220)) 
Z = store() 
""" 

test1 = """ 
C = A + B 
""" 

test2 = """ 
Z.C = A + B 
""" 

print timeit.timeit(test1, setup, number=1000) 
print timeit.timeit(test2, setup, number=1000) 

, die mir gegeben haben: 40.9241290092 40.7675480843

Ich dachte, weil Z.C Speicher vorbelegt wurde, gäbe es weniger Overhead jedes Mal, wenn ich hinzugefügt A+B und benötigt einen Ort, um es zu speichern, dh weniger Anrufe zu malloc hinter den Kulissen oder so ähnlich. Was vermisse ich?

+3

'ZC = A + B' aktualisiert nicht das gleiche Array, es ist eine komplett neue Zuweisung. –

+0

Oh, warum ist 'Z.C' nicht immer dieselbe Speicheradresse, weil es ein Mitglied von Z ist, das bereits zugewiesen wurde? – NLi10Me

+1

'Z.C' reserviert nichts vorher, jetzt zeigt es auf ein numpy Array und später kann es auf eine Zeichenkette zeigen. Sobald es auf ein neues Objekt zeigt, wird das alte Objekt als Müll gesammelt, wenn es keine Referenzen mehr darauf gibt. –

Antwort

0

Zuordnung eine schnelle Operation, zusätzlich ist teurer:

In [7]: %timeit np.empty((220, 220, 220)) 
1000 loops, best of 3: 472 µs per loop 

In [8]: u= np.ones((220, 220, 220)) 

In [9]: %timeit u+u 
10 loops, best of 3: 73.5 ms per loop 

Also, auch richtig Sie Ihr Array aktualisieren (Z.C[:]= A+B) Sie werden nicht viel in Ihrem Fall gewinnen (~ 0,5%)

.