Python 为什么matplotlib在使用plot()绘制直线时会变慢?
我想知道为什么使用matplotlib绘制直线时速度会非常慢?如何修复它 下面是演示代码。它使用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
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()