2017-08-02 17 views
0

我遇到了一個我正在開發的IO模塊以訪問文件格式(基於ASCII)的數據的問題。實例化QApplication後我的代碼的性能問題

它在普通python腳本中使用時表現良好,但當我嘗試在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) 

第一嵌段需要10秒,而第二相同塊,app = QApplication([])需要50秒後。 我可以在應用程序實例化之前和之後重複執行幾次代碼,並且在初始化應用程序之前的所有塊都相對較快,而之後的所有塊都很慢。

a = f["1.1/measurement/mca_0/data"]通過用Cython包裝的C函數導致數據文件被訪問78026次,每次讀取一行「行」。返回的對象是形狀爲(78026,1024)和dtype float64的節點陣列。

有沒有人有什麼可能導致此問題的線索? Qt和封裝的C代碼之間是否存在已知的問題/干擾?

+1

您的操作系統和您的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([])可以在將來幫助某人。