我在开发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代码之间是否存在已知问题/干扰?
答案 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([])
修改语言环境的信息可以在将来帮助某人。