.. SPDX-FileCopyrightText: 2021 cusy GmbH .. .. SPDX-License-Identifier: BSD-3-Clause perflint ======== `perflint `_ ist eine Erweiterung für `pylint `_ für Performance-Anti-Patterns. Installation ------------ .. code-block:: console $ uv add --dev perflint Verwendung ---------- … als eigenständiger Linter ~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: console $ uv run perflint src/ … als ``pylint``-Plugin ~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: console $ uv run perflint src/ --load-plugins=perflint … als pre-commit-Hook ~~~~~~~~~~~~~~~~~~~~~ perflint kann auch mit dem :doc:`/productive/git/advanced/hooks/pre-commit` verwendet werden: .. code-block:: yaml :caption: .pre-commit-config.yaml repos: - repo: https://github.com/tonybaloney/perflint rev: 0.8.1 hooks: - id: perflint Regeln ------ 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 zu ``if``-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()``. .. seealso:: * `Zero-copy interactions `_ * `Memoryview Benchmarks `_ * `Memoryview Benchmarks 2 `_ 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 einer ``for``-Schleife. W8402: ``use-list-copy`` Verwendet eine Listenkopie mit ``list.copy()`` anstelle einer ``for``-Schleife. W8403: ``use-dict-comprehension`` Verwendet ein Dictionary Comprehensions anstelle einer einfachen ``for``-Schleife.