IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques tierces Python Discussion :

win32com et performances


Sujet :

Bibliothèques tierces Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut win32com et performances
    Bonjour à tous

    Récemment, j'essaie d'interfacer Python et quelques outils Office, notamment pour étendre les fonctionalités de recherche dans les documents.

    Je pensais tout d'abord faire quelques tests de performances, histoire de voir jusqu'à quel point je pourrais utiliser la chose, et en effet, sur un faible nombre de fichiers (moins d'une centaine) j'avais des résultats plutôt bons.

    Cependant, lorsque j'augmente le nombre de fichiers, les performances s'écroulent au bout d'un moment => à code identique, le temps d'analyse d'un seul fichier est plus qye décuplé dans certains cas.

    Pour info, voici mon code, très simple

    Powerpoint.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    # -*- coding: utf-8 -*-
     
    from OfficeConstants import constants
    import win32com.client
    import os
     
    class PowerpointApplication(object):
     
        def __init__(self):
            self.app = win32com.client.gencache.EnsureDispatch("Powerpoint.Application")
            self.keywords = set()
            self.presentation = None
     
        def assign_file(self, filename):
            assert os.path.exists(filename)
            self.presentation = filename
            self.app.Presentations.Open(filename, WithWindow=0)
     
        def unassign_file(self):
            if self.presentation:
                self.app.Presentations(self.presentation).Close()
                self.presentation = None
     
        def add_keyword(self, keyword):
            assert isinstance(keyword, unicode)
            self.keywords.add(keyword)
     
        def search_slides(self):
            results = {}
            if self.keywords:
                for keyword in self.keywords:
                    match = False
                    results[keyword] = None
                    for nb, slide in enumerate(self.app.Presentations[0].Slides):
                        if match:
                            break
                        for shape in slide.Shapes:
                            if shape.HasTextFrame:
                                text = shape.TextFrame.TextRange
                                if isinstance(text, unicode) and keyword in text:
                                    results[keyword].append(nb)
                                    match = True
                                    break
    Main.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    # -*- coding: utf-8 -*-
     
    import Powerpoint
    import time
     
    ppt = Powerpoint.PowerpointApplication()
     
    filename = u'C:\\Documents and Settings\\mouah\\fichier.ppt'
     
    def main(n):
        a = time.time()
        for i in xrange(n):
            ppt.assign_file(filename)
            ppt.add_keyword(u"Project")
            res = ppt.search_slides()
            ppt.unassign_file()
        b = time.time()
        print n, float(b - a)/n
     
    import cProfile
    cProfile.run('main(20)')
    for i in xrange(20):
        main(20)
    #time.sleep(60)
    cProfile.run('main(20)')
    Dans ce cas de figure, je passe de 3 secs à 1 minute pour 20 fichiers.
    Le profiling m'indique que la fonction getattr mange beaucoup plus dans le second cas.
    En revanche, décommenter le dernier sleep me permet de revenir à des performances normales.
    Un problème d'embouteillage de l'interface COM ?

    Si quelqu'un pouvait m'éclairer de ses lumières

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 114
    Par défaut
    Bonjour

    Quelques pistes pour comprendre ce qui se passe :
    est-ce qu'il n'y aurait pas des techniques dites "lazzy" mise en oeuvre dans office. C'est à dire par exemple, qu'à l'appel de self.app.Presentations(self.presentation).Close(), il note le fichier comme étant à fermer, mais attend d'avoir du temps pour le faire réellement. Dans le cas du bench sans pause, cela fait gonfler la mémoire utilisée (tous les documents sont conservés en mémoire), déclenche des phénomènes de swap, et donc dégrade les performances. Alors que dans le bench avec pause, cela lui laisse du temps pour réellement fermer les fichiers.

    Que se passe-t-il si on rajoute une petite pause, 0,1 s devrait suffire, après le close ?

    Cordialement
    Emmanuel

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour cette réponse.

    D'après ce que j'ai pu en voir, la consommation mémoire n'évolue pas anormalement, et je ne swappe pas du tout.
    Par contre, le sleep a effectivement tendance a stabiliser le temps d'analyse à long terme.
    Je me demande s'il n'y aurait pas un moyen de "flusher" les tâches à exécuter par Office dans ces cas-là...

Discussions similaires

  1. [maintenance][performance] Que faire comme maintenance ?
    Par woodwai dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 06/11/2003, 15h39
  2. Performance xml
    Par MicKCanE dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 07/07/2003, 06h41
  3. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 16h18
  4. [JDBC][connexion persistante] performances avec JDBC
    Par nawac dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 06/05/2003, 10h37
  5. performance entre 3DS, ase, asc ...
    Par amaury pouly dans le forum OpenGL
    Réponses: 3
    Dernier message: 24/03/2003, 11h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo