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
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
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
Dans ce cas de figure, je passe de 3 secs à 1 minute pour 20 fichiers.
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)')
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![]()
Partager