Accueil » Python » Forums Python » Forum général Python » Traitement de listes importantes, optimisation, pyrex ?

 • Traitement de listes importantes, optimisation, pyrex ?

Document Actions
Réponses: 4   Visites: 0
Up one level
Vous devez être un membre enregistré pour contribuer sur ce forum. Inscrivez-vous maintenant

 • Traitement de listes importantes, optimisation, pyrex ?

Posté par NooZ le 04/01/2008 17:49
Bonjour à tous,
je travail sur une appli de traitement d'image en temps réel et je me retrouve confronté à un problème de performances, le principal goulôt d'étranglement est la fonction qui extracte les zones "chaudes" de mon image.

J'ai déjà une optimisation avec psyco qui tourne (c'est pour ça que je n'utilise pas de list comprehension pour le premier for) mais j'ai encore du 0.500s par appel ce qui est au moins 100 fois trop lent

Je me demande si je n'aurais pas fait quelques bourdes d'architectures qui pourrait me tuer mon script, Je me suis permis d'envoyé la fonction sous forme de fichier texte (la balise code du forum ne digère que mes 3 premières lignes :| ) si à tout hasard vous pouviez m'indiquer quelques astuces ^^

J'ai tenté de passer le tout sous Pyrex, mais je ne vois pas du tout par où commencer, l'interet se trouve principalement dans les type statiques non ? comment en profiter vu que j'utilise des listes de tuples du type[(R, G, B), (R, G, B),...], j'ai fait plusieurs tentatives sans succès (même ordre de grandeur que du python sans psyco)

Quelles seraient mes "options" pour optimiser ce code, vais-je devoir me remédier à passer en C ?

Merci d'avance (et bonne année au passage ;) )

 • Re: Traitement de listes importantes, optimisation, pyrex ?

Posté par NooZ le 04/01/2008 18:29
Arf, je suis désolé apparement mon post s'est dédoublé, si un admin, pouvait en supprimer un.
Merci, encore désolé.

 • Re: Traitement de listes importantes, optimisation, pyrex ?

Posté par alexd le 07/01/2008 01:38
Bonsoir et bonne année,

Je penses que tu aurais à gagner à utiliser une structure de données plus brute pour manipuler ton image, comme un tableau array.array ou numpy.array. Tu pourras ainsi le manipuler comme un tableau C avec pyrex et eviter beaucoup d'appels python qui ralentissent ta boucle.

Je te conseille d'utiliser cython (www.cython.org) à la place de pyrex, car il y a de nombreuses fonctionnalités et d'optimisation en plus, notamment les mutations de listes et l'optimisation des boucles. Le wiki est rempli de bonne pratiques et d'exemples d'optimisation.

En restant au niveau de python, il est possible d'optimiser ta boucle, par exemple

code:
def une_methode():
  for i in une_grande_liste:
    self.x += truc
    self.methode(machin)


Peut s'optimiser en:

code:
def une_methode():
  x = self.x
  methode = self.methode
  for i in une_grande_liste:
    x += truc
    methode(machin)
  self.x = x


Car la résolution des noms s'effectue une seule fois en dehors de la boucle

Cordialement,
Alexandre

 • Re: Traitement de listes importantes, optimisation, pyrex ?

Posté par glickind le 07/01/2008 11:21
pour faire de l'optimisation, pense aussi à cProfile :
The state of Python profilers in two words

pour l'optimisation du tri des listes: cProfile et
heapq :
Speeding up dateutil: Python's heapq module turns minutes into seconds

PS merci a Brian Beck pour son blog

a+
Gael

 • Re: Traitement de listes importantes, optimisation, pyrex ?

Posté par NooZ le 08/01/2008 15:14
En convertissant l'image en N&B directement avec la PIL ( monimage.convert('L') ), en conservant cet array "brut" pour faire les traitements, et en définissants les variables hors des boucles, le temps d'execution viens de tomber à 0,003s, et toujours en python, merci beaucoup ^^

merci aussi pour les infos sur cProfile je ne conaissais pas et ça va surement m'être utile.