Ich habe versucht, den Unterschied zwischen A + = B und A = A + B in Python herauszufinden
Experimentierumgebung
OS |
macOS Sierra |
CPU |
2.3 GHz Intel Core i7 |
Erinnerung |
16 GB 1600 MHz DDR3 |
Python-Version |
2.7.10 |
Experiment
Vorbereitung
- Ich habe die folgenden etwas größeren Daten und Funktionen vorbereitet und die Ausführungszeit, die Objektkennung nach der Berechnung bzw. den Bytecode überprüft.
- Rufen Sie vor und nach dem Funktionsaufruf
time.time ()
auf, um die Ausführungszeit anhand der Differenz zu messen
- Verwenden Sie nach der Operation die integrierte Funktion
id ()
für die Objektkennung.
- Verwenden Sie das Modul
dis
, um den Bytecode zu überprüfen
def add(list_x, list_y):
list_x = list_x + list_y
return list_x
def inplace(list_x, list_y):
list_x += list_y
return list_x
list_a = [[0 for x in range(10000)] for y in range(10000)]
list_b = [[0 for x in range(10000)] for y in range(10000)]
Versuchsergebnis
- Ich habe einen Code erstellt, der Folgendes ausgibt, und ihn bestätigt.
add(list_a, list_b)
Ausführungszeit: 0.000458
id(list_a): 4391953400 -> 5530614960
------ dis.dis(add) ------
8 0 LOAD_FAST 0 (list_a)
3 LOAD_FAST 1 (list_b)
6 BINARY_ADD
7 STORE_FAST 0 (list_a)
9 10 LOAD_FAST 0 (list_a)
13 RETURN_VALUE
inplace(list_a, list_b)
Ausführungszeit: 0.000285
id(list_a): 5530614960 -> 5530614960
------ dis.dis(inplace) ------
44 0 LOAD_FAST 0 (list_a)
3 LOAD_FAST 1 (list_b)
6 INPLACE_ADD
7 STORE_FAST 0 (list_a)
45 10 LOAD_FAST 0 (list_a)
13 RETURN_VALUE
|
add |
inplace |
Ergebnis |
Ausführungszeit |
0.000458 |
0.000285 |
an Ort und Stelle ist schneller |
Bytecode Unterschied |
BINARY_ADD |
INPLACE_ADD |
Sie können sehen, dass es sich auch mit dem Bytecode geändert hat |
id(list_a) |
Es gibt eine Veränderung |
Keine Änderung |
add wird als neues Objekt erstellt und place wird demselben Objekt ein Wert zugewiesen. |
- Anscheinend ist das Hinzufügen langsamer, da dem neuen Objekt ein Speicherbereich zugewiesen werden muss.
- Der Unterschied ist gering, aber angesichts der internen Operation dachte ich, es wäre besser, A + = B unter dem Gesichtspunkt des Speichers und der Ausführungsgeschwindigkeit zu verwenden.
Motivation
Ich war mir der internen Bewegungen beider Parteien nie bewusst gewesen und habe sie selbst untersucht.
Solange es mir peinlich ist, wenn ich dachte: "Lass es uns gemeinsam tun!" ... Ungefähr zu dieser Zeit begann ich zu denken, dass ich eine Haltung erlangen sollte, um diese Teile zu verstehen.