Maison développement back-end Tutoriel Python De puissantes techniques d'optimisation des performances Python pour un code plus rapide

De puissantes techniques d'optimisation des performances Python pour un code plus rapide

Dec 14, 2024 am 10:53 AM

owerful Python Performance Optimization Techniques for Faster Code

En tant que développeur Python, j'ai appris que l'optimisation du code est cruciale pour créer des applications hautes performances. Dans cet article, je partagerai sept techniques puissantes que j'ai utilisées pour améliorer les performances du code Python, en me concentrant sur des méthodes pratiques pour améliorer la vitesse d'exécution et l'efficacité de la mémoire.

Générateurs et itérateurs

L'un des moyens les plus efficaces d'optimiser le code Python consiste à utiliser des générateurs et des itérateurs. Ces outils sont particulièrement utiles lorsque vous travaillez avec de grands ensembles de données, car ils nous permettent de traiter les données sans tout charger en mémoire en même temps.

J'utilise souvent des générateurs lorsque j'ai besoin de travailler avec des séquences trop volumineuses pour tenir confortablement en mémoire. Voici un exemple de fonction génératrice qui produit des nombres premiers :

def prime_generator():
    yield 2
    primes = [2]
    candidate = 3
    while True:
        if all(candidate % prime != 0 for prime in primes):
            primes.append(candidate)
            yield candidate
        candidate += 2
Copier après la connexion
Copier après la connexion

Ce générateur me permet de travailler avec une séquence infinie de nombres premiers sans tous les stocker en mémoire. Je peux l'utiliser comme ceci :

primes = prime_generator()
for _ in range(10):
    print(next(primes))
Copier après la connexion
Copier après la connexion

Compréhensions de listes et expressions génératrices

Les compréhensions de listes et les expressions génératrices sont des alternatives concises et souvent plus rapides aux boucles traditionnelles. Ils sont particulièrement utiles pour créer de nouvelles listes ou parcourir des séquences.

Voici un exemple de compréhension de liste qui met au carré des nombres pairs :

numbers = range(10)
squared_evens = [x**2 for x in numbers if x % 2 == 0]
Copier après la connexion
Copier après la connexion

Pour les séquences plus volumineuses, je préfère les expressions génératrices pour économiser de la mémoire :

numbers = range(1000000)
squared_evens = (x**2 for x in numbers if x % 2 == 0)
Copier après la connexion
Copier après la connexion

Types de données de conteneurs hautes performances

Le module collections de Python fournit plusieurs types de données de conteneurs hautes performances qui peuvent améliorer considérablement l'efficacité du code.

J'utilise souvent deque (file d'attente à double extrémité) lorsque j'ai besoin d'ajouts et de pops rapides des deux extrémités d'une liste :

from collections import deque

queue = deque(['a', 'b', 'c'])
queue.append('d')
queue.appendleft('e')
Copier après la connexion
Copier après la connexion

Counter est un autre type de données utile pour compter les objets hachables :

from collections import Counter

word_counts = Counter(['apple', 'banana', 'apple', 'cherry'])
Copier après la connexion
Copier après la connexion

Ensembles et dictionnaires pour des recherches rapides

Les ensembles et les dictionnaires utilisent des tables de hachage en interne, ce qui les rend extrêmement rapides pour les recherches et les tests d'adhésion. Je les utilise chaque fois que j'ai besoin de vérifier si un élément existe dans une collection ou lorsque je dois supprimer les doublons d'une liste.

Voici un exemple d'utilisation d'un ensemble pour des tests d'adhésion rapides :

numbers = set(range(1000000))
print(500000 in numbers)  # This is much faster than using a list
Copier après la connexion

Compilation juste à temps avec Numba

Pour les calculs numériques, Numba peut apporter des améliorations de vitesse significatives grâce à une compilation juste à temps. Voici un exemple d'utilisation de Numba pour accélérer une fonction qui calcule l'ensemble de Mandelbrot :

from numba import jit
import numpy as np

@jit(nopython=True)
def mandelbrot(h, w, maxit=20):
    y, x = np.ogrid[-1.4:1.4:h*1j, -2:0.8:w*1j]
    c = x + y*1j
    z = c
    divtime = maxit + np.zeros(z.shape, dtype=int)

    for i in range(maxit):
        z = z**2 + c
        diverge = z*np.conj(z) > 2**2
        div_now = diverge & (divtime == maxit)
        divtime[div_now] = i
        z[diverge] = 2

    return divtime
Copier après la connexion

Cette fonction peut être jusqu'à 100 fois plus rapide que son équivalent Python pur.

Cython pour C-Speed

Quand j'ai besoin d'encore plus de vitesse, je me tourne vers Cython. Cython me permet de compiler du code Python en C, ce qui entraîne des améliorations significatives des performances. Voici un exemple simple de fonction Cython :

def prime_generator():
    yield 2
    primes = [2]
    candidate = 3
    while True:
        if all(candidate % prime != 0 for prime in primes):
            primes.append(candidate)
            yield candidate
        candidate += 2
Copier après la connexion
Copier après la connexion

Cette fonction Cython peut être plusieurs fois plus rapide qu'une implémentation Python pure.

Profilage et optimisation

Avant d'optimiser, il est crucial d'identifier où se trouvent les goulots d'étranglement. J'utilise cProfile pour le timing et memory_profiler pour l'analyse de l'utilisation de la mémoire.

Voici comment j'utilise cProfile :

primes = prime_generator()
for _ in range(10):
    print(next(primes))
Copier après la connexion
Copier après la connexion

Pour le profilage de la mémoire :

numbers = range(10)
squared_evens = [x**2 for x in numbers if x % 2 == 0]
Copier après la connexion
Copier après la connexion

Ces outils m'aident à concentrer mes efforts d'optimisation là où ils auront le plus d'impact.

Mémoisation avec functools.lru_cache

La mémorisation est une technique que j'utilise pour mettre en cache les résultats d'appels de fonctions coûteux. Le décorateur functools.lru_cache rend cela facile :

numbers = range(1000000)
squared_evens = (x**2 for x in numbers if x % 2 == 0)
Copier après la connexion
Copier après la connexion

Cela peut considérablement accélérer les fonctions récursives en évitant les calculs redondants.

Itération efficace avec itertools

Le module itertools fournit une collection d'outils rapides et économes en mémoire pour créer des itérateurs. Je les utilise souvent pour des tâches telles que combiner des séquences ou générer des permutations.

Voici un exemple d'utilisation d'itertools.combinations :

from collections import deque

queue = deque(['a', 'b', 'c'])
queue.append('d')
queue.appendleft('e')
Copier après la connexion
Copier après la connexion

Bonnes pratiques pour écrire du code Python performant

Au fil des années, j'ai développé plusieurs bonnes pratiques pour écrire du code Python efficace :

  1. Optimiser les boucles : j'essaie de déplacer autant de code que possible en dehors des boucles. Pour les boucles imbriquées, je m'assure que la boucle intérieure est aussi rapide que possible.

  2. Réduire la surcharge des appels de fonction : pour les très petites fonctions qui sont appelées fréquemment, j'envisage d'utiliser des fonctions en ligne ou des expressions lambda.

  3. Utiliser des structures de données appropriées : je choisis la bonne structure de données pour la tâche. Par exemple, j'utilise des ensembles pour des tests d'adhésion rapides et des dictionnaires pour des recherches rapides de valeurs-clés.

  4. Réduire la création d'objets : la création de nouveaux objets peut être coûteuse, en particulier à l'intérieur des boucles. J'essaie de réutiliser les objets lorsque cela est possible.

  5. Utilisez les fonctions et bibliothèques intégrées : les fonctions intégrées et la bibliothèque standard de Python sont souvent optimisées et plus rapides que les implémentations personnalisées.

  6. Évitez les variables globales : l'accès aux variables globales est plus lent que l'accès aux variables locales.

  7. Utilisez « in » pour les tests d'adhésion : pour les listes, les tuples et les ensembles, l'utilisation de « in » est plus rapide qu'une boucle.

Voici un exemple qui intègre plusieurs de ces pratiques :

from collections import Counter

word_counts = Counter(['apple', 'banana', 'apple', 'cherry'])
Copier après la connexion
Copier après la connexion

Cette fonction utilise un defaultdict pour éviter de vérifier explicitement si une clé existe, traite les données en une seule boucle et utilise une compréhension de dictionnaire pour le calcul final.

En conclusion, l'optimisation du code Python est une compétence qui s'acquiert avec la pratique et l'expérience. En appliquant ces techniques et en mesurant toujours l'impact de vos optimisations, vous pouvez écrire du code Python non seulement élégant mais aussi très performant. N'oubliez pas qu'une optimisation prématurée est la racine de tous les maux, alors profilez toujours votre code en premier pour identifier où les optimisations sont vraiment nécessaires.


Nos créations

N'oubliez pas de consulter nos créations :

Centre des investisseurs | Centre des investisseurs espagnol | Investisseur central allemand | Vie intelligente | Époques & Échos | Mystères déroutants | Hindutva | Développeur Élite | Écoles JS


Nous sommes sur Medium

Tech Koala Insights | Epoques & Echos Monde | Support Central des Investisseurs | Mystères déroutants Medium | Sciences & Epoques Medium | Hindutva moderne

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment résoudre le problème des autorisations rencontré lors de la visualisation de la version Python dans le terminal Linux? Comment résoudre le problème des autorisations rencontré lors de la visualisation de la version Python dans le terminal Linux? Apr 01, 2025 pm 05:09 PM

Solution aux problèmes d'autorisation Lors de la visualisation de la version Python dans Linux Terminal Lorsque vous essayez d'afficher la version Python dans Linux Terminal, entrez Python ...

Comment éviter d'être détecté par le navigateur lors de l'utilisation de Fiddler partout pour la lecture de l'homme au milieu? Comment éviter d'être détecté par le navigateur lors de l'utilisation de Fiddler partout pour la lecture de l'homme au milieu? Apr 02, 2025 am 07:15 AM

Comment éviter d'être détecté lors de l'utilisation de FiddlereVerywhere pour les lectures d'homme dans le milieu lorsque vous utilisez FiddlereVerywhere ...

Comment copier efficacement la colonne entière d'une dataframe dans une autre dataframe avec différentes structures dans Python? Comment copier efficacement la colonne entière d'une dataframe dans une autre dataframe avec différentes structures dans Python? Apr 01, 2025 pm 11:15 PM

Lorsque vous utilisez la bibliothèque Pandas de Python, comment copier des colonnes entières entre deux frames de données avec différentes structures est un problème courant. Supposons que nous ayons deux dats ...

Comment Uvicorn écoute-t-il en permanence les demandes HTTP sans servir_forever ()? Comment Uvicorn écoute-t-il en permanence les demandes HTTP sans servir_forever ()? Apr 01, 2025 pm 10:51 PM

Comment Uvicorn écoute-t-il en permanence les demandes HTTP? Uvicorn est un serveur Web léger basé sur ASGI. L'une de ses fonctions principales est d'écouter les demandes HTTP et de procéder ...

Comment enseigner les bases de la programmation novice en informatique dans le projet et les méthodes axées sur les problèmes dans les 10 heures? Comment enseigner les bases de la programmation novice en informatique dans le projet et les méthodes axées sur les problèmes dans les 10 heures? Apr 02, 2025 am 07:18 AM

Comment enseigner les bases de la programmation novice en informatique dans les 10 heures? Si vous n'avez que 10 heures pour enseigner à l'informatique novice des connaissances en programmation, que choisissez-vous d'enseigner ...

Comment obtenir des données d'information en contournant le mécanisme anti-frawler d'Investing.com? Comment obtenir des données d'information en contournant le mécanisme anti-frawler d'Investing.com? Apr 02, 2025 am 07:03 AM

Comprendre la stratégie anti-rampe d'investissement.com, Beaucoup de gens essaient souvent de ramper les données d'actualités sur Investing.com (https://cn.investing.com/news/latest-news) ...

See all articles