Ceux qui développent ou testent depuis plusieurs années se sentent souvent confus. Le développement de nouvelles fonctions ou la maintenance d'anciennes fonctions sont essentiellement des tas de code. Cet article parle principalement de l'optimisation des performances dans la conception et l'architecture du système pour que tout le monde puisse l'apprendre. Une partie du contenu implique des produits spécifiques, certaines modifications ont été apportées ou des démonstrations de code de test ont été écrites séparément.
Contexte du projet :
Mettre en œuvre un outil de test de diamètre haute performance, accepter 1 000 + envoyer 1 000 et prendre en charge jusqu'à 2 000 messages par seconde dans les deux sens . Le code source du protocole Diameter est téléchargé depuis http://sourceforge.net/projects/pyprotosim/. Ce package open source prend également en charge SMPP, RADIUS, DHCP, LDAP et les champs de protocole nouvellement ajoutés peuvent être configurés dans le dictionnaire. C'est vraiment pratique si vous devez modifier le code. Dans la phase initiale, afin d'implémenter la fonction, nous n'avons pas beaucoup pris en compte les problèmes de performances. Des threads uniques ont été utilisés à de nombreux endroits, et les performances initiales ne pouvaient prendre en charge que 50 messages. Environnement matériel : SunFire 4170, 16 cœurs, 2,4 G par cœur
Plusieurs directions pour l'optimisation des performances Python :
1. Changer l'analyseur Python : Les analyseurs Python courants incluent pysco, pypy, cython, jython et pysco no ne prend plus en charge Python 2.7, donc il n'y a pas de test. On dit qu'il fonctionne aussi vite que le langage C. J'ai fait un test simple sur pypy et jython. pypy peut être amélioré jusqu'à 5 à 10 fois sur différentes machines. Bien que Jython puisse éviter le problème de python GIL (car jython fonctionne sur une machine virtuelle Java), le test montre que les gains d'efficacité sont. minimal.
2. Optimiser le code
3. Changer l'architecture système, multi-threading, multi-processus ou coroutine
Option 1 : Changer l'analyseur Python
Si changer l'analyseur Python peut répondre aux exigences de performances, c'est la solution la moins chère et ne nécessite aucune modification du code. Le code suivant sert simplement à illustrer l'effet de pypy. Il s'agit d'un code de test écrit séparément et le résultat d'une exécution sous Windows. L'effet de fonctionnement sera meilleur sur une machine Linux.
#!/usr/bin/env python #coding=utf-8 import time def check(num): a = list(str(num)) b = a[::-1] if a == b: return True return False def test(): all = xrange(1,10**7) for i in all: if check(i): if check(i**2): i**2 if __name__ == '__main__': start=time.time() test() print time.time()-start
Les résultats de l'exécution de python et pypy respectivement
C:Python27python.exeD:/RCC/mp/src/test.py
14.4940001965
C:pypy-2.1pypy.exeD:/RCC/mp/src/test.py
4.37800002098
On peut voir que l'effet de l'exécution de pypy le résultat est encore évident Oui, même si on peut l'augmenter de 5 fois (sur une machine Linux), 50*5, on est encore loin des 2000. pypy n'a aucun effet évident sur la prise en charge du multi-threading Python, qui sera mentionné plus tard.
Finissons-en maintenant. C'est trop long et tout le monde semble fatigué. La partie optimisation du code sera introduite dans le prochain article.
[Cours recommandé : Tutoriel vidéo Python]
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!