【问题标题】:Why is my matplotlib script terribly slow on macbook desktop but works fine on external monitor? (Python, matplotlib, OSX)为什么我的 matplotlib 脚本在 macbook 桌面上非常慢,但在外接显示器上运行良好? (Python、matplotlib、OSX)
【发布时间】:2021-09-05 08:39:29
【问题描述】:

我正在使用 python 编写的后处理绘图脚本,使用 python 3.7 和 OSX 10.14

该脚本可能没有优化,但当我使用外接显示器时它运行良好。 当我尝试在我的 macbook pro 15" 显示器 (2018) 上运行它时,它会冻结并变得非常缓慢且无响应,除非我将图形尺寸设置得足够小。

我不知道原因,也没有找到任何解释浏览互联网。关于什么可能导致这种行为以及如何解决它的任何线索?

这是我正在运行的脚本的“剪辑”版本。

import numpy as np
import matplotlib
from matplotlib import pyplot as plt
from matplotlib.patches import Rectangle, Circle
import sys


def main(iter0,iterN,its,out_dir='output'):
    it0 = int(iter0)
    itN = int(iterN)
    itstep = int(its)
    a = list(range(it0,itN+1,itstep))
    loaded_steps=len(a)
    e = np.loadtxt(out_dir+'/energy_data_dynamics')
    #... load many other files

    plt.ion()
    fig = plt.figure(figsize=(20, 20),facecolor="white")  #THESE DIMENSIONS WORK FOR ANY EXTERNAL SCREEN 
#    fig = plt.figure(figsize=(10, 10),facecolor="white") #THESE DIMENSIONS WORK FOR MACBOOK SCREEN

    it = 0
    for index in range(0,loaded_steps):
        plt.cla()
        plt.axes().set_aspect('equal')
        #... plot many other subplots
        ax414=plt.subplot(414)
        ax414.plot(e[it0+it,0], e[it0+it,2], marker="o", color="crimson", ms=15)
        ax414.plot(e[it0:itN+1,0], e[it0:itN+1,2],'-r')
        ax414.set_title("Energy")

        plt.show()
        plt.pause(0.0000000001)
        
        it+=itstep
        if index == loaded_steps-1:
            input("Plot finished - Press [enter] to continue.")




if __name__ == '__main__':
    matplotlib.use("TkAgg")
    its = 1
    out_dir = 'output'
    if len(sys.argv)>=4:
        its = sys.argv[3]
    if len(sys.argv)>=5:
        out_dir = sys.argv[4]
    main(sys.argv[1],sys.argv[2],its,out_dir)

【问题讨论】:

  • tkAgg 在 MacOS 上似乎存在重大问题 - 也许尝试使用 pyqt5 或 macOSx 后端。您也可以重新考虑使用如此巨大的图形尺寸。 20 英寸 x 20 英寸比大多数显示器都大,除非您有 32 英寸显示器...
  • 20x20 背后的想法是它在大多数显示器上自动调整为 max_dimension,或者至少这是我在 tkAgg 中观察到的行为。使用 macOSX 似乎可以解决“缓慢”问题,但后来我无法再更改尺寸并且自动调整大小不起作用。尝试 pyqt5 结果为ValueError: 'pyqt5' is not a valid value for backend; supported values are ['GTK3Agg', 'GTK3Cairo', 'MacOSX', 'nbAgg', 'Qt4Agg', 'Qt4Cairo', 'Qt5Agg', 'Qt5Cairo', 'TkAgg', 'TkCairo', 'WebAgg', 'WX', 'WXAgg', 'WXCairo', 'agg', 'cairo', 'pdf', 'pgf', 'ps', 'svg', 'template']
  • 如果你真的想这样做,你可能会尝试最大化窗口? stackoverflow.com/questions/12439588/…
  • @JodyKlymak 我看到了那个页面,但没有针对 macOSX 后端的建议解决方案,而且我似乎无法使用 qt 或 wx 后端......(也许我做错了什么尝试实现它们时?)编辑:使用 macOSX 是不可行的:它会停止与图形的所有交互,所以我无法缩放或保存它,使绘图几乎没用。
  • 试试 qt5agg。很抱歉让您感到困惑

标签: python macos matplotlib multiple-monitors


【解决方案1】:

如果不运行您的代码,很难给出直接的答案,但您所描述的症状(适用于外部显示器,但不适用于内部显示器)听起来您可能遇到了 GPU 错误。外部显示器可能使用不同的 GPU(通常是第二个 GPU 与内置 GPU)。但是这个简单的脚本表明,减速意味着存在错误(您的代码、驱动程序、某处)或函数调用导致了问题。

与您的绘图相比,这些数字看起来很小:10x10 的数字大小和 15 的标记大小?我将开始使用内置监视器逐行注释,直到它再次变得快速。可能还有一种更有效的方法来清除轴和重新绘制——我发现当我尝试清除图形和重绘时 Python / plt 非常慢。您可能还想尝试在循环之外创建子图,因为某些实现/操作系统在创建子图时有很多开销。

【讨论】:

  • 如果是 GPU 问题,您是否知道如何强制使用特定 GPU?或任何其他建议?关于其余部分,我认为尺寸并没有真正相关,数字很大(20x20 比屏幕大),子情节适合并且标记在那里作为装饰。你认为我可以上传一个“energy_data_dynamics”文件供其他人测试代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 2018-10-12
相关资源
最近更新 更多