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?
'ZC = A + B' aktualisiert nicht das gleiche Array, es ist eine komplett neue Zuweisung. –
Oh, warum ist 'Z.C' nicht immer dieselbe Speicheradresse, weil es ein Mitglied von Z ist, das bereits zugewiesen wurde? – NLi10Me
'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. –