Python 3.x 慢速matplotlib-将图保存为PNG

Python 3.x 慢速matplotlib-将图保存为PNG,python-3.x,matplotlib,Python 3.x,Matplotlib,快速摘要:matplotlib savefig速度太慢,无法使用PNG。。。寻找关于如何加速的想法/想法,或其他图书馆(chaco?cairo?) 更新:添加了一些(非常粗略和现成的)代码,以在底部进行说明 我正在使用matplotlib(python 3.x,四核macbook上最新的anaconda)通过imshow()创建单个1024x102NP数组(int16)的绘图。我的目标是简单地在磁盘上生成一个带注释的图像文件(不需要交互式显示) 轴设置为完全填充图形(因此没有样条线/tics

快速摘要:matplotlib savefig速度太慢,无法使用PNG。。。寻找关于如何加速的想法/想法,或其他图书馆(chaco?cairo?)


更新:添加了一些(非常粗略和现成的)代码,以在底部进行说明


我正在使用matplotlib(python 3.x,四核macbook上最新的anaconda)通过
imshow()
创建单个1024x102NP数组(int16)的绘图。我的目标是简单地在磁盘上生成一个带注释的图像文件(不需要交互式显示)

轴设置为完全填充图形(因此没有样条线/tics等),dpi/大小组合设置为匹配阵列的大小-因此没有缩放/插值等

在单轴的顶部,我显示了3个文本区域和一些(~6)矩形补丁

…因此,从绘图的角度看,没有什么新奇和简单的东西

但是,当我将图形(使用
savefig
)保存到PNG时,大约需要1.8秒(!!!)。 …保存为raw或jpg都在约0.7秒时到达

我尝试将后端切换到Agg,但这将savefig()的时间增加到约2.1秒


我认为这太慢了,是不是错了?我更喜欢用PNG而不是JPG保存,但我不明白为什么PNG比JPG慢那么多。我的目标是在AWS上部署,所以这里需要考虑速度

附近有更快的图书馆吗?(我不需要交互式UI打印,只需要基本的保存到文件打印)


下面是一些大致说明这一点的粗略代码。我的机器上的输出是:

current backend: MacOSX
default save: 0.4048
default save - float64: 0.3446
full size figure: 0.8105
full size figure - with text/rect: 0.9023
jpg: full size figure - with text/rect: 0.7468
current backend:  agg
AGG: full size figure - with text/rect: 1.3511
AGG: jpg: full size figure - with text/rect: 1.1689
我无法(即使在反复尝试之后)让示例代码重现我在应用程序中看到的~1.7秒(处理时间)savefig(),但我认为下面的代码仍然说明了a)jpg比png快(或者相反,png看起来慢)b)它看起来仍然慢(imo)

所以我不应该期待比这更快的事情吗。。。这就是它的速度吗? 有没有更快的后端可用? 当我在AWS(linux)上部署时,最好/最快的后端是什么



试着制作一个
PIL
图像对象,对我来说,它比
matplotlib
快100多倍:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

data = np.random.random((100, 100))
cm = plt.get_cmap('viridis')
img = Image.fromarray((cm(data)[:, :, :3] * 255).astype(np.uint8))
img.save('image.png')
如果您只需要灰度缩放,您可以跳过
get\u cmap
业务-只需将阵列缩放到0到255的范围

注释必须添加到
PIL


使用
matplotlib
的一个重要区别是它是逐像素的。所以,如果你想应用一些缩放,你必须先插值。您可以使用它。

pip安装cv-python之类的东西


在这种情况下,cv2.imwrite比两者都快。

使用matplotlib保存jpg应该比保存png慢。您能展示产生问题的代码吗?(). 另外,使用Agg后端不应该花费更长的时间(但与什么相比?)。也许可以尝试使用PIL?如果你想要假颜色,检查这个问题:我刚刚注意到你也有文字和补丁。。。我将暂时保留我的答案,以防有用,但在看不到你的图片的情况下,我不会尝试复制。我将发布一个半可行的演示-该代码现在是2000行脚本的一部分,所以这就是为什么我最初没有这样做:数据文本和补丁似乎没有增加大量时间(请参阅更新的帖子)。不幸的是,我无法让我上面的示例代码重现我的应用程序代码的~1.7秒节省时间(不确定确切原因,但我已经在几个小时的headscratch之后找出原因…)谢谢@kwinkunks。请参阅上面的评论-我可能会使用PIL,但我需要比默认情况下更丰富的可用注释(箭头、椭圆和旋转的矩形等),因此我坚持使用matplotlib。像素对像素的大小和我正在做的一样(可能),但可能会出现抗锯齿的缺失。对,这是有道理的。
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

data = np.random.random((100, 100))
cm = plt.get_cmap('viridis')
img = Image.fromarray((cm(data)[:, :, :3] * 255).astype(np.uint8))
img.save('image.png')