PyPlot show()在调用PyQt4.QFileDialog.getOpenFileNames()后确实很慢

时间:2014-03-18 21:20:49

标签: matplotlib pyqt4 pyside qfiledialog getopenfilename

对于分析应用程序,我试图:

  1. 使用PyQt4 QFileDialog
  2. 从用户处获取文件名列表
  3. 从每个文件中提取一些数据
  4. 使用pyplot
  5. 绘制汇总数据

    但是,以这种方式获取文件名会导致pyplot.show()花费很长时间。我已将问题归结为以下测试用例:

    import matplotlib.pyplot as plt
    from PyQt4 import QtCore, QtGui
    
    app = QtGui.QApplication(None)
    
    fd = QtGui.QFileDialog(None)
    filenames = fd.getOpenFileNames(caption='Select Data Files')
    
    plt.plot([1,2,3,4,5])
    plt.show()
    

    请注意,我甚至没有对这里的文件名做任何事情 - 只是得到它们。

    从对话框中选择单个文件会导致绘图时间为10秒。有趣的是,show()完成所需的时间与所选文件的数量大致呈线性关系。对于10个文件,绘图需要大约67秒。

    这对于绘制来自少数几个文件的数据并不是一件大事,但是当从蒙特卡罗模拟中聚合数据时,有数千个文件可能需要几个小时来显示。告诉matplotlib使用Qt4Agg后端导致相同的行为。

    如果我注释掉对getOpenFileNames的调用,脚本将在一秒钟内完成。

    我正在运行相关软件包的以下版本(应该是最新版本):

    • Python 2.7
    • matplotlib 1.3.1
    • python-sip 4.13.2-1
    • python-qt4 4.9.1-2ubuntu1
    • python-sip-dev 4.13.2-1
    • python-qt4-dev 4.9.1-2ubuntu1

    我卸载了sip,qt4并重新安装了它们 - 同样的问题。我已经在两台独立的机器上看到了这个问题 - 两台机器都运行32位Ubuntu 12.04。

    任何帮助都会非常感激 - 我已经浪费了大量时间等待剧情展示。


    更新

    • 所选文件的类型和名称似乎并不重要。
    • 取消或退出文件对话框不会导致延迟和即时情节。
    • 以sudo身份运行脚本可以解决问题;但是,当我以sudo身份运行时,文件对话框看起来不同,可能正在使用与pyplot使用PyQt不同的gui后端,因此可能是一个红色的鲱鱼。
    • 程序不会挂起在getOpenFileNames中,它会在下一次使用PyQt的调用时挂起。无论是情节还是其他文件对话框似乎都不重要 - 第一个文件对话框都会阻止它们。
    • 运行对话框后调用app.processEvents()并没有帮助。
    • 使用PySide代替PyQt4会导致相同的行为。
    • 使用getOpenFileName而不是getOpenFileNames会导致相同的行为。
    • 使用DontUseNativeDialog选项运行getOpenFileNames(无延迟)
    • 其他任何QFileDialog选项都没有任何效果(ShowDirsOnly,DontResolveSymlinks,DontConfirmOverwrite,ReadOnly,HideNameFilterDetails,DontUseSheet)

0 个答案:

没有答案