Langsame Verwendung der Computersprache 2
Es gibt viele Möglichkeiten, Ihren Computer zu verlangsamen.
Hier ist ein Beispiel für Python Numpy. wie folgt B = A [3: 6] erstellt keine Kopie, sondern ist nur ein Alias für das Subarray. Da es sich um einen Alias handelt, wird beim Ändern des Elements von B auch das ursprüngliche Array geändert.
C = A [3: 6] +0 erstellt eine Kopie. Das Ändern der Kopie ändert daher nicht das ursprüngliche Array. Wenn Sie diesen Unterschied nicht kennen würden, würden Sie sagen: "Ich wollte die Kopie ändern, aber die ursprüngliche Reihenfolge hat sich geändert." Es wird Fehler verursachen, die Anfängern häufig sind.
>>> import numpy as np >>> A=np.arange(0,10,1) >>> A array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> A[3:6] array([3, 4, 5]) \ >>>> B = A [3: 6] # Hiermit wird keine Kopie erstellt >>> B[0]=-3 >>> A array([ 0, 1, 2, -3, 4, 5, 6, 7, 8, 9]) \ >>>> C = A [3: 6] +0 # Dies erstellt eine Kopie >>> C array([-3, 4, 5]) >>> C[0]=-30 >>> A array([ 0, 1, 2, -3, 4, 5, 6, 7, 8, 9]) >>>
Es ist auch schneller, wenn Sie die Zuordnung durch eine In-situ-Zuordnung ersetzen. Erwägen Sie die Verwendung von * =, + =, - = usw.
inplace.py
# -*- coding: utf-8 -*-
import cv2
import numpy as np
e0 = cv2.getTickCount()
a = np.ones((1024, 1024))
for i in range(20):
a = a*2
print np.sum(a[:])
e1 = cv2.getTickCount()
a = np.ones((1024, 1024))
for i in range(20):
a *= 2
print np.sum(a[:])
e2 = cv2.getTickCount()
print (e1 - e0) / cv2.getTickFrequency(), "# a = a*2"
print (e2 - e1) / cv2.getTickFrequency(), "# a *= 2"
print (e2 - e1) / (e1 - e0)
** Ausführungsergebnis ** 1.09951162778e+12 1.09951162778e+12 0.116400550283 # a = a*2 0.0270198481919 # a *= 2 0.23212818261
Die Bearbeitungszeit wurde auf 23% reduziert (4-mal schneller).
** Zusammenfassung ** ・ Erstellen Sie keine Kopie im Teilarray ・ Verwenden Sie nicht "* =", wenn "* =" ausreicht.
Für Python "High Performance Python" Du solltest lesen.
Recommended Posts