perflint¶
perflint ist eine Erweiterung für pylint für Performance-Anti-Patterns, u.a.:
- W8101:
unnecessary-list-cast
Unnötige Verwendung von
list()
bei einem bereits iterierbarem Typ.- W8102:
incorrect-dictionary-iterator
Falsche Iterator-Methode für
dict
: Python-Dictionaries speichern Schlüssel und Werte in zwei separaten Tabellen. Sie können einzeln iteriert werden. Die Verwendung von.items()
und das Verwerfen entweder des Schlüssels oder des Wertes mit_
ist ineffizient, wenn stattdessen.keys()
oder.values()
verwendet werden können.- W8201:
loop-invariant-statement
Die Schleife wird untersucht, um Anweisungen oder Ausdrücke zu ermitteln, deren Ergebnis bei jeder Iteration einer Schleife konstant ist, da sie auf benannten Variablen basieren, die während der Iteration nicht verändert werden.
- W8202:
loop-global-usage
Globale Namensverwendung in einer Schleife: Das Laden globaler Variablen ist langsamer als das Laden lokaler Variablen. Der Unterschied ist marginal, aber wenn er in einer Schleife weitergegeben wird, kann es zu einer spürbaren Geschwindigkeitsverbesserung kommen.
- R8203:
loop-try-except-usage
Bis Python 3.10 sind
try
…except
-Blöcke im Vergleich zuif
-Anweisungen sehr rechenintensiv.Vermeidet es, sie in einer Schleife zu verwenden, da sie erhebliche Overheads verursachen können. Refaktoriert euren Code so, dass keine iterationsspezifischen Details erforderlich sind und legt die gesamte Schleife in den
try
-Block.- W8204:
memoryview-over-bytes
Das Slicing von Byte-Objekten in Schleifen ist ineffizient, da eine Kopie der Daten erstellt wird. Verwendet stattdessen
memoryview()
.- W8205:
dotted-import-in-loop
Der direkte Import des Namens
%s
ist in einer Schleife effizienter. In Python könnt ihr ein Modul importieren und dann auf Untermodule als Attribute zugreifen. Ihr könnt auch auf Funktionen als Attribute dieses Moduls zugreifen. Dadurch werden die Importanweisungen minimal gehalten. Wenn ihr diese Methode jedoch in einer Schleife verwendet, ist sie ineffizient, da bei jedem Schleifendurchlauf erst global, dann das Attribut und dann die Methode geladen wird.- W8301:
use-tuple-over-list
Verwendet ein Tupel anstelle einer Liste für eine unveränderliche Sequenz: Sowohl die Konstruktion als aoch die Indizierung eines Tupels ist schneller als die einer Liste.
- W8401:
use-list-comprehension
Verwendet List Comprehensions mit oder ohne
if
-Anweisung anstelle einerfor
-Schleife.- W8402:
use-list-copy
Verwendet eine Listenkopie mit
list.copy()
anstelle einerfor
-Schleife.- W8403:
use-dict-comprehension
Verwendet ein Dictionary Comprehensions anstelle einer einfachen
for
-Schleife.