Python 为什么matplotlib在使用plot()绘制直线时会变慢?

Python 为什么matplotlib在使用plot()绘制直线时会变慢?,python,performance,matplotlib,plot,Python,Performance,Matplotlib,Plot,我想知道为什么使用matplotlib绘制直线时速度会非常慢?如何修复它 下面是演示代码。它使用plot()在两个随机生成的点之间画一条线 在我的电脑上,“END=100/200/500”结果是“FPS=36.9/28.6/20”。我需要无休止地画界限,而这将变得更糟,而时间。如何解决? 谢谢 matplotlib会随着脚本的进行而变得越来越慢,因为它会重新绘制您以前绘制的所有线条,甚至是那些已经从屏幕上滚动下来的线条。请尝试以下操作: import numpy as np import mat

我想知道为什么使用matplotlib绘制直线时速度会非常慢?如何修复它

下面是演示代码。它使用
plot()
在两个随机生成的点之间画一条线

在我的电脑上,“END=100/200/500”结果是“FPS=36.9/28.6/20”。我需要无休止地画界限,而这将变得更糟,而时间。如何解决? 谢谢


matplotlib会随着脚本的进行而变得越来越慢,因为它会重新绘制您以前绘制的所有线条,甚至是那些已经从屏幕上滚动下来的线条。

请尝试以下操作:

import numpy as np
import matplotlib.pyplot as plt
import time

def draw_demo2(ax):
    x = 100
    ax.set_xlim([x-100, x + 250])
    ax.set_ylim([0, 1])

    END = 250
    time_start = time.time()

    ln, = ax.plot([], [])
    x_data = []
    y_data = []
    for i in range(0, END):
        random_num = np.random.random()

        if i%100 == 99:
            cur_xlim = ax.get_xlim()
            ax.set_xlim(np.array(cur_xlim) + 100)
        x += 1
        x_data.append(x)
        y_data.append(random_num)
        ln.set_data(x_data, y_data)
        ax.figure.canvas.draw_idle()
        ax.figure.canvas.flush_events()

    print ('FPS:', END/(time.time()-time_start))


if __name__ == '__main__':
    draw_demo()
可能值得将x和y数据缓冲区截断到视图范围(因为每次绘制屏幕时列表都转换为数组)

如果你真的需要快速浏览blitting,但是这并不能很好地与更改限制交互,重新绘制文本是绘制图形最慢的部分之一


另外,请尝试使用qt而不是tk,我看到这一变化使速度提高了4倍。

发布的代码没有给出您描述的文本输出。请将您的问题包括您正在运行的确切代码。修改了
def draw\u demo2():
def draw\u demo()中:
。请不要伸手触摸
ax.lines
。将来有可能会成为私有的(应该是,但它的命名早于
-前缀是私有的约定)。如果要删除最后一行,请保留对它的引用。啊,很高兴将来知道。进行此更改时,您是否会保留API的
ax.get_lines()
部分,它允许您基本上仍然这样做?
import numpy as np
import matplotlib.pyplot as plt
import time

def draw_demo2(ax):
    x = 100
    ax.set_xlim([x-100, x + 250])
    ax.set_ylim([0, 1])

    END = 250
    time_start = time.time()

    ln, = ax.plot([], [])
    x_data = []
    y_data = []
    for i in range(0, END):
        random_num = np.random.random()

        if i%100 == 99:
            cur_xlim = ax.get_xlim()
            ax.set_xlim(np.array(cur_xlim) + 100)
        x += 1
        x_data.append(x)
        y_data.append(random_num)
        ln.set_data(x_data, y_data)
        ax.figure.canvas.draw_idle()
        ax.figure.canvas.flush_events()

    print ('FPS:', END/(time.time()-time_start))


if __name__ == '__main__':
    draw_demo()