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