2017-08-02 1 views
0

J'ai un problème avec un module d'E/S que je suis en train de développer pour accéder aux données dans un format de fichier (ASCII).Problème de performances avec mon code après l'instanciation de QApplication

Il fonctionne correctement lorsqu'il est utilisé dans un script python standard, mais il est 5 fois plus lent lorsque j'essaie de l'utiliser dans un widget PyQt.

Voici le code simplifié qui montre la question:

from silx.io import spech5 
import time 
from PyQt4.QtGui import QApplication 

with spech5.SpecH5("../data/mesh_and_mca.dat") as f: 
    start = time.time() 
    a = f["1.1/measurement/mca_0/data"] 
    end = time.time() 
    print("Simple access in python ", end - start) 

app = QApplication([]) 

with spech5.SpecH5("../data/mesh_and_mca.dat") as f: 
    start = time.time() 
    a = f["1.1/measurement/mca_0/data"] 
    end = time.time() 
    print("Access after initializing QApplication ", end - start) 

Le premier bloc 10 secondes, tandis que le second bloc identique, après app = QApplication([]) prend 50 secondes. Je peux répéter le code plusieurs avant et après l'instanciation de l'application, et tous les blocs avant d'initialiser l'application sont relativement rapides alors que tous les blocs après elle sont lents.

La ligne a = f["1.1/measurement/mca_0/data"] provoque l'accès au fichier de données 78026 fois via une fonction C encapsulée avec Cython, pour lire une seule "ligne" à chaque fois. Les objets renvoyés sont un tableau numérique de forme (78026, 1024) et dtype float64.

Quelqu'un at-il une idée de ce qui pourrait causer cela? Y a-t-il des problèmes/interférences connus entre Qt et le code C enveloppé?

+1

Votre système d'exploitation et les détails de votre environnement python peuvent être utiles ici – user3419537

+0

L'utilisation de 'QCoreApplication' peut-elle faire la différence? – ekhumoro

+0

Debian 8, à la fois Python 2.7.9 et Python 3.4.2 montrent le problème. J'ai également testé PyQt4 et PyQt5, aucune différence. – PiRK

Répondre

0

Un collègue a finalement trouvé la cause première!

La bibliothèque C sous-jacente effectue un travail supplémentaire si les paramètres régionaux ne correspondent pas à ceux de la valeur par défaut 'C' (voir https://github.com/silx-kit/silx/blob/master/silx/io/specfile/src/locale_management.c). Et QApplication définit l'environnement local sur 'en_US.UTF-8'.

Je peux reproduire le problème sans QApplication:

import locale 

with ...: 
    do the work 

locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8') 

with ...: 
    same work, much slower 

Désolé pour cette question très précise. J'espère que les informations sur QApplication([]) modifiant les paramètres régionaux peuvent aider quelqu'un dans le futur.