2017-08-02 6 views
0

私が開発しているIOモジュールに問題があり、ファイル形式(ASCIIベース)でデータにアクセスしています。QApplicationのインスタンス化後のコードでのパフォーマンスの問題

通常のPythonスクリプトで使用するとOKですが、PyQtウィジェットで使用しようとすると5倍遅くなります。

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) 

app = QApplication([])は50秒かかり後の最初のブロックは、第同じブロックしながら、10秒かかる。

これは問題を示す簡略化されたコードです。 アプリケーションのインスタンス化の前後に複数のコードを繰り返すことができます。アプリケーションを初期化する前のブロックはすべて比較的高速ですが、後のすべてのブロックは遅いです。

a = f["1.1/measurement/mca_0/data"]は、CythonでラップされたC関数を介してデータファイルに78026回アクセスし、そのたびに1つの "行"を読み込みます。返されるオブジェクトは、形状(78026,1024)およびdtype float64のnumpy配列です。

誰かがこれを引き起こす可能性についての手がかりを持っていますか? QtとラップされたCコードの間に既知の問題や干渉はありますか?

+1

あなたのOSとあなたのPython環境の詳細が参考になるかもしれません。 – user3419537

+0

「QCoreApplication」を使用して違いがありますか? – ekhumoro

+0

Debian 8では、Python 2.7.9とPython 3.4.2の両方で問題が示されています。私はPyQt4とPyQt5もテストしましたが、違いはありません。 – PiRK

答えて

0

仲間がついに根本原因を見つけました!

ロケールが 'C'デフォルトのものでない場合は、基礎となるCライブラリが追加作業を行います(https://github.com/silx-kit/silx/blob/master/silx/io/specfile/src/locale_management.c参照)。 QApplicationは、ロケールを'en_US.UTF-8'に設定します。

だから私はQApplicationせずに問題を複製することができます

import locale 

with ...: 
    do the work 

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

with ...: 
    same work, much slower 

この非常に具体的な質問のために申し訳ありません。私はロケールを変更するQApplication([])についての情報が今後誰かを助けることができれば幸いです。

関連する問題