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

2024-10-02 10:30:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个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秒。 我可以在应用程序实例化前后重复几次代码,初始化应用程序之前的所有块都比较快,而初始化应用程序之后的所有块都比较慢。你知道吗

a = f["1.1/measurement/mca_0/data"]通过Cython包装的C函数访问数据文件78026次,每次读取一行。返回的对象是shape(780261024)和dtypefloat64的numpy数组。你知道吗

有人知道是什么导致了这一切吗?Qt和包装的C代码之间是否存在已知的问题/干扰?你知道吗


Tags: 代码fromimport应用程序datatimewithstart
1条回答
网友
1楼 · 发布于 2024-10-02 10:30:01

一位同事终于找到了根本原因!你知道吗

如果语言环境不是默认的“C”,则底层C库会做一些额外的工作(请参见https://github.com/silx-kit/silx/blob/master/silx/io/specfile/src/locale_management.c)。 并且QApplication将locale设置为'en_美国.UTF-8'。你知道吗

所以我可以复制这个问题而不需要QApplication

import locale

with ...:
    do the work

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

with ...:  
    same work, much slower

很抱歉问了这个非常具体的问题。我希望有关QApplication([])修改区域设置的信息可以帮助将来的人。你知道吗

相关问题 更多 >

    热门问题