2017-08-02 2 views
0

Ich habe ein Problem mit einem IO-Modul, das ich entwickle, um auf Daten in einem Dateiformat (ASCII-basiert) zuzugreifen.Leistungsproblem mit meinem Code nach der Instantiierung von QApplication

Es führt OK aus, wenn es in einem regulären Python-Skript verwendet wird, aber es ist 5 mal langsamer, wenn ich versuche, es in einem PyQt-Widget zu verwenden.

Dies ist der vereinfachte Code, der das Problem zeigt:

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) 

Der erste Block dauert 10 Sekunden, während der zweite identisch Block nach app = QApplication([]) 50 Sekunden dauert. Ich kann den Code mehrere vor und nach der Instanziierung der App wiederholen, und alle Blöcke vor der Initialisierung der App sind relativ schnell, während alle nachfolgenden Blöcke langsam sind.

Die Zeile a = f["1.1/measurement/mca_0/data"] bewirkt, dass die Datendatei 78026 Mal über eine mit Cython eingewickelte C-Funktion aufgerufen wird, um jeweils eine einzelne "Zeile" zu lesen. Die zurückgegebenen Objekte sind ein numpliges Array von Form (78026, 1024) und dtype float64.

Hat jemand eine Ahnung, was das verursachen könnte? Gibt es bekannte Probleme/Interferenzen zwischen Qt und gewickeltem C-Code?

+1

Ihr Betriebssystem und Details Ihrer Python-Umgebung könnten hier hilfreich sein – user3419537

+0

Macht die Verwendung von 'QCoreApplication' einen Unterschied? – ekhumoro

+0

Debian 8, Python 2.7.9 und Python 3.4.2 zeigen das Problem. Ich habe auch PyQt4 und PyQt5 getestet, kein Unterschied. – PiRK

Antwort

0

Ein Kollege hat endlich die Ursache gefunden!

Die zugrunde liegende C-Bibliothek führt einige zusätzliche Arbeit aus, wenn das Gebietsschema nicht das 'C' ist (siehe https://github.com/silx-kit/silx/blob/master/silx/io/specfile/src/locale_management.c). Und QApplication setzt das Gebietsschema auf 'en_US.UTF-8'.

So kann ich das Problem ohne QApplication replizieren:

import locale 

with ...: 
    do the work 

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

with ...: 
    same work, much slower 

Sorry für diese sehr spezifische Frage. Ich hoffe, dass die Information über QApplication([]) das Gebietsschema ändern kann jemandem in der Zukunft helfen.