zu numpy Arrays Anfügen ist sehr ineffizient. Dies liegt daran, dass der Interpreter in jedem einzelnen Schritt Speicher für das gesamte Array finden und zuweisen muss. Je nach Anwendung gibt es viel bessere Strategien.
Wenn Sie die Länge im Voraus kennen, empfiehlt es sich, das Array mit einer Funktion wie np.ones
, np.zeros
oder np.empty
vorzubelegen.
desired_length = 500
results = np.empty(desired_length)
for i in range(desired_length):
results[i] = i**2
Wenn Sie nicht über die Länge wissen, es ist wahrscheinlich effizienter Ihre Ergebnisse in einer regelmäßigen Liste zu halten und wandelt es danach in ein Array.
results = []
while condition:
a = do_stuff()
results.append(a)
results = np.array(results)
Hier sind einige Timings auf meinem Computer.
def pre_allocate():
results = np.empty(5000)
for i in range(5000):
results[i] = i**2
return results
def list_append():
results = []
for i in range(5000):
results.append(i**2)
return np.array(results)
def numpy_append():
results = np.array([])
for i in range(5000):
np.append(results, i**2)
return results
%timeit pre_allocate()
# 100 loops, best of 3: 2.42 ms per loop
%timeit list_append()
# 100 loops, best of 3: 2.5 ms per loop
%timeit numpy_append()
# 10 loops, best of 3: 48.4 ms per loop
So können Sie sehen, dass sowohl die Vor-Zuweisung und die Verwendung einer Liste als auch die Konvertierung viel schneller sind.