实例化QApplication后我的代码出现性能问题

时间:2017-08-02 14:16:36

标签: python pyqt cython

我在开发IO模块时遇到问题,以文件格式(基于ASCII)访问数据。

它在常规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秒。 我可以在app实例化之前和之后重复几次代码,初始化应用程序之前的所有块都相对较快,而后面的所有块都很慢。

a = f["1.1/measurement/mca_0/data"]导致数据文件通过包含Cython的C函数被访问78026次,以读取单个"行"每一次。返回的对象是一个形状为(78026,1024)和dtype float64 的numpy数组。

有没有人知道可能导致这种情况的原因? Qt和包装的C代码之间是否存在已知问题/干扰?

1 个答案:

答案 0 :(得分: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([])修改语言环境的信息可以在将来帮助某人。