rel*_*ima 16 python performance plot matplotlib cstring
我正在努力加快将图表保存到图像的过程.现在我正在创建一个cString对象,我使用savefig保存图表; 但我真的非常感谢任何帮助改进这种保存图像的方法.我必须做几十次这个操作,而savefig命令非常慢; 必须有更好的方法.我读了一些关于将其保存为未压缩的原始图像的内容,但我不知道如何做到这一点.如果我可以切换到另一个更快的后端,我真的不关心agg.
即:
RAM = cStringIO.StringIO()
CHART = plt.figure(....
**code for creating my chart**
CHART.savefig(RAM, format='png')
Run Code Online (Sandbox Code Playgroud)
我一直在使用matplotlib和FigureCanvasAgg后端.
谢谢!
Joe*_*ton 34
如果你只是想要一个原始缓冲区,尝试fig.canvas.print_rgb,fig.canvas.print_raw等(两者之间的区别是,raw是RGBA,而rgb为RGB.还有print_png,print_ps等)
这将fig.dpi代替savefig(100 dpi)的默认dpi值.不过,即使比较fig.canvas.print_raw(f)和fig.savefig(f, format='raw', dpi=fig.dpi)该print_canvas版本稍快不明显更快,因为它不打扰重置轴的补片,等等,那颜色savefig(默认设置).
然而,无论如何,大多数时间花在以原始格式保存图形上的只是绘制图形,这是无法绕过的.
无论如何,作为一个毫无意义但又有趣的例子,请考虑以下因素:
import matplotlib.pyplot as plt
import numpy as np
import cStringIO
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)
num = 50
max_dim = 10
x = max_dim / 2 * np.ones(num)
s, c = 100 * np.random.random(num), np.random.random(num)
scat = ax.scatter(x,x,s,c)
ax.axis([0,max_dim,0,max_dim])
ax.set_autoscale_on(False)
for i in xrange(1000):
xy = np.random.random(2*num).reshape(num,2) - 0.5
offsets = scat.get_offsets() + 0.3 * xy
offsets.clip(0, max_dim, offsets)
scat.set_offsets(offsets)
scat._sizes += 30 * (np.random.random(num) - 0.5)
scat._sizes.clip(1, 300, scat._sizes)
fig.canvas.draw()
Run Code Online (Sandbox Code Playgroud)

如果我们看一下原始抽奖时间:
import matplotlib.pyplot as plt
import numpy as np
import cStringIO
fig = plt.figure()
ax = fig.add_subplot(111)
num = 50
max_dim = 10
x = max_dim / 2 * np.ones(num)
s, c = 100 * np.random.random(num), np.random.random(num)
scat = ax.scatter(x,x,s,c)
ax.axis([0,max_dim,0,max_dim])
ax.set_autoscale_on(False)
for i in xrange(1000):
xy = np.random.random(2*num).reshape(num,2) - 0.5
offsets = scat.get_offsets() + 0.3 * xy
offsets.clip(0, max_dim, offsets)
scat.set_offsets(offsets)
scat._sizes += 30 * (np.random.random(num) - 0.5)
scat._sizes.clip(1, 300, scat._sizes)
fig.canvas.draw()
Run Code Online (Sandbox Code Playgroud)
我的机器需要大约25秒.
如果我们将原始RGBA缓冲区转储到cStringIO缓冲区,它实际上在~22秒时略微快一些(这只是因为我使用的是交互式后端!否则它将是等效的.):
import matplotlib.pyplot as plt
import numpy as np
import cStringIO
fig = plt.figure()
ax = fig.add_subplot(111)
num = 50
max_dim = 10
x = max_dim / 2 * np.ones(num)
s, c = 100 * np.random.random(num), np.random.random(num)
scat = ax.scatter(x,x,s,c)
ax.axis([0,max_dim,0,max_dim])
ax.set_autoscale_on(False)
for i in xrange(1000):
xy = np.random.random(2*num).reshape(num,2) - 0.5
offsets = scat.get_offsets() + 0.3 * xy
offsets.clip(0, max_dim, offsets)
scat.set_offsets(offsets)
scat._sizes += 30 * (np.random.random(num) - 0.5)
scat._sizes.clip(1, 300, scat._sizes)
ram = cStringIO.StringIO()
fig.canvas.print_raw(ram)
ram.close()
Run Code Online (Sandbox Code Playgroud)
如果我们将此与使用相比较,使用savefig相对设置的dpi:
import matplotlib.pyplot as plt
import numpy as np
import cStringIO
fig = plt.figure()
ax = fig.add_subplot(111)
num = 50
max_dim = 10
x = max_dim / 2 * np.ones(num)
s, c = 100 * np.random.random(num), np.random.random(num)
scat = ax.scatter(x,x,s,c)
ax.axis([0,max_dim,0,max_dim])
ax.set_autoscale_on(False)
for i in xrange(1000):
xy = np.random.random(2*num).reshape(num,2) - 0.5
offsets = scat.get_offsets() + 0.3 * xy
offsets.clip(0, max_dim, offsets)
scat.set_offsets(offsets)
scat._sizes += 30 * (np.random.random(num) - 0.5)
scat._sizes.clip(1, 300, scat._sizes)
ram = cStringIO.StringIO()
fig.savefig(ram, format='raw', dpi=fig.dpi)
ram.close()
Run Code Online (Sandbox Code Playgroud)
这需要大约23.5秒.基本上,savefig只是设置一些默认参数和调用print_raw,在这种情况下,所以差别很小.
现在,如果我们将原始图像格式与压缩图像格式(png)进行比较,我们会发现更显着的差异:
import matplotlib.pyplot as plt
import numpy as np
import cStringIO
fig = plt.figure()
ax = fig.add_subplot(111)
num = 50
max_dim = 10
x = max_dim / 2 * np.ones(num)
s, c = 100 * np.random.random(num), np.random.random(num)
scat = ax.scatter(x,x,s,c)
ax.axis([0,max_dim,0,max_dim])
ax.set_autoscale_on(False)
for i in xrange(1000):
xy = np.random.random(2*num).reshape(num,2) - 0.5
offsets = scat.get_offsets() + 0.3 * xy
offsets.clip(0, max_dim, offsets)
scat.set_offsets(offsets)
scat._sizes += 30 * (np.random.random(num) - 0.5)
scat._sizes.clip(1, 300, scat._sizes)
ram = cStringIO.StringIO()
fig.canvas.print_png(ram)
ram.close()
Run Code Online (Sandbox Code Playgroud)
这需要~52秒!显然,压缩图像会产生很多开销.
无论如何,这可能是一个不必要的复杂的例子......我想我只是想避免实际工作......
| 归档时间: |
|
| 查看次数: |
11718 次 |
| 最近记录: |