Warum ist der Zugriff auf lokale Variablen schneller als der Zugriff auf Klassenmitglieder in Python?

8

Bei dem Versuch, ein komplexeres Problem zu lösen, habe ich die Zugriffsgeschwindigkeit mit lokalen Variablen gegen Member-Variablen verglichen.

Hier ein Testprogramm:

%Vor%

Ich weiß, es könnte eine schlechte Idee sein, StressTestMember und StressTestLocal bei jeder Iteration zu instanziieren, aber es macht Sinn in dem modellierten Programm, wo diese im Grunde Active Records sind.

Nach einem einfachen Benchmark,

  • LOCAL Zugangstest: 0m22.836
  • MEMBER-Zugriffstest: 0m32.648s

Die lokale Version ist ~ 33% schneller, obwohl sie noch Teil einer Klasse ist. Warum?

    
yadutaf 13.09.2012, 00:48
quelle

2 Antworten

20
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ tag123performance ___ Für Fragen zur Messung oder Verbesserung der Code- und Anwendungseffizienz. ___ antwort12398055 ___

self.m += 1 bedeutet, dass Sie eine lokale Variable namens self suchen und dann das Attribut m

finden müssen

Natürlich, wenn Sie nur eine lokale Variable nachschlagen müssen, wird es ohne den zusätzlichen Schritt schneller.

Es kann nützlich sein zu sehen, was unter der Haube passiert:

%Vor%     
___ qstntxt ___

Bei dem Versuch, ein komplexeres Problem zu lösen, habe ich die Zugriffsgeschwindigkeit mit lokalen Variablen gegen Member-Variablen verglichen.

Hier ein Testprogramm:

%Vor%

Ich weiß, es könnte eine schlechte Idee sein, %code% und %code% bei jeder Iteration zu instanziieren, aber es macht Sinn in dem modellierten Programm, wo diese im Grunde Active Records sind.

Nach einem einfachen Benchmark,

  • LOCAL Zugangstest: 0m22.836
  • MEMBER-Zugriffstest: 0m32.648s

Die lokale Version ist ~ 33% schneller, obwohl sie noch Teil einer Klasse ist. Warum?

    
___ tag123benchmarking ___ Benchmarking ist der Prozess des Vergleichens von zwei oder mehr Systemen oder Prozessen unter kontrollierten Bedingungen, um ein quantitatives Maß zu haben, mit dem sie verglichen oder eingestuft werden können. Das Benchmarking-Tag sollte für Fragen zur Durchführung von Benchmarking-Aufgaben oder theoretischen Fragen verwendet werden, nicht für Listen von Benchmarking-Ergebnissen oder Anfragen für Benchmarking-Daten; Diese Fragen sind für Stack Overflow off-topic. ___ qstnhdr ___ Warum ist der Zugriff auf lokale Variablen schneller als der Zugriff auf Klassenmitglieder in Python? ___ antwort12398033 ___

Lokale Namen sind schneller, weil Python einige Optimierungen vornimmt, so dass lokale Namen keinen dict-Zugriff benötigen. Auf der anderen Seite müssen Instanzattribute auf %code% des Objekts zugreifen.

Dies ist auch der Grund, warum lokale Namen schneller sind als globale Namen.

    
___
John La Rooy 13.09.2012, 01:00
quelle
5
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ tag123performance ___ Für Fragen zur Messung oder Verbesserung der Code- und Anwendungseffizienz. ___ antwort12398055 ___

__dict__ bedeutet, dass Sie eine lokale Variable namens %code% suchen und dann das Attribut %code%

finden müssen

Natürlich, wenn Sie nur eine lokale Variable nachschlagen müssen, wird es ohne den zusätzlichen Schritt schneller.

Es kann nützlich sein zu sehen, was unter der Haube passiert:

%Vor%     
___ qstntxt ___

Bei dem Versuch, ein komplexeres Problem zu lösen, habe ich die Zugriffsgeschwindigkeit mit lokalen Variablen gegen Member-Variablen verglichen.

Hier ein Testprogramm:

%Vor%

Ich weiß, es könnte eine schlechte Idee sein, %code% und %code% bei jeder Iteration zu instanziieren, aber es macht Sinn in dem modellierten Programm, wo diese im Grunde Active Records sind.

Nach einem einfachen Benchmark,

  • LOCAL Zugangstest: 0m22.836
  • MEMBER-Zugriffstest: 0m32.648s

Die lokale Version ist ~ 33% schneller, obwohl sie noch Teil einer Klasse ist. Warum?

    
___ tag123benchmarking ___ Benchmarking ist der Prozess des Vergleichens von zwei oder mehr Systemen oder Prozessen unter kontrollierten Bedingungen, um ein quantitatives Maß zu haben, mit dem sie verglichen oder eingestuft werden können. Das Benchmarking-Tag sollte für Fragen zur Durchführung von Benchmarking-Aufgaben oder theoretischen Fragen verwendet werden, nicht für Listen von Benchmarking-Ergebnissen oder Anfragen für Benchmarking-Daten; Diese Fragen sind für Stack Overflow off-topic. ___ qstnhdr ___ Warum ist der Zugriff auf lokale Variablen schneller als der Zugriff auf Klassenmitglieder in Python? ___ antwort12398033 ___

Lokale Namen sind schneller, weil Python einige Optimierungen vornimmt, so dass lokale Namen keinen dict-Zugriff benötigen. Auf der anderen Seite müssen Instanzattribute auf %code% des Objekts zugreifen.

Dies ist auch der Grund, warum lokale Namen schneller sind als globale Namen.

    
___
HYRY 13.09.2012 00:57
quelle