【发布时间】:2013-09-25 03:55:00
【问题描述】:
我今天偶然发现:如果线宽小于 1.0,在 matplotlib 中绘制线条似乎要快得多。我只在Mac上测试过这个,但效果似乎很强烈。
例如,如果您尝试此代码,您会发现数据的绘制速度快了大约 10 倍,线宽为 0.5,而不是线宽 1.0。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,10,20000)
y = np.sin(x) + np.random.random(len(x))*0.1
plt.ion()
plt.show()
plt.plot(x,y,lw=0.5)
plt.draw()
plt.figure()
plt.plot(x,y,lw=1.0)
plt.draw()
我用这段代码做了一个线宽和速度之间关系的图表:
import numpy as np
import matplotlib.pyplot as plt
import time
x = np.linspace(0,10,10000)
y = np.sin(x) + np.random.random(len(x))*0.1
plt.ion()
plt.show()
linewidths = np.linspace(2,0,20)
times = []
for lw in linewidths:
t = time.time()
plt.plot(x,y,lw=lw)
plt.draw()
times.append(time.time()-t)
plt.figure()
plt.ioff()
plt.plot(linewidths[1:],times[1:],'ro')
plt.xlabel('Linewidth (points)')
plt.ylabel('Time (seconds)')
plt.show()
结果如下:
使用小于 1.0 的线宽可提供约 10 倍的加速,在 1.0 之后,时间线性增加。如果数据点的数量很大,我只观察到这种效果,大于大约 5000 个点左右。对我来说,如果我要求 matplotlib 显示更多像素,那么绘制绘图可能需要更长的时间,但我没想到使用稍小的线宽(0.5 对 1.0)会带来巨大的加速。
谁能解释为什么会发生这种情况?我很高兴发现它,因为它可以更快地显示大型数据集。
有些人认为这可能特定于 MacOSX 后端。这似乎很可能。如果我尝试以 png 格式保存图而不是将它们绘制到屏幕上,则时间似乎更随机分布:
【问题讨论】:
-
有趣。它似乎不依赖于别名,因为至少在我的机器上,即使对于所有线宽,线别名也设置为 True。
-
我认为这很可能取决于操作系统或后端。在 Mac Lion 上,使用后端 Qt4Agg,使用你的脚本,我得到的点随机分布在 0.081 秒左右,所以粗线基本上不会慢。
-
我猜这与 Agg 级别的细节有关,但@flebool 似乎说这不是 Agg 的错。您使用的是什么后端/操作系统/版本? (
matplotlib.get_backend()和matplotlib.__version__) -
我已经在我的 linux 机器上试用了 GTK、Qt 和 WX,但它们都没有表现出这种行为——它看起来像是 Mac 特有的怪癖。有趣!
-
是的,使用您的代码我会收到消息:
python3.3 matplotlib_speed.py /opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/matplotlib/pyplot.py:412: RuntimeWarning: More than 20 figures have been opened. Figures created through the pyplot interface (matplotlib.pyplot.figure) are retained until explicitly closed and may consume too much memory. (To control this warning, see the rcParamfigure.max_num_figures). max_open_warning, RuntimeWarning)
标签: python macos numpy matplotlib scipy