我希望找到一種方法來優化以下情況。我有一個用matplotlib imshow創建的大輪廓圖。然後我想用這個輪廓圖來創建大量的png圖像,其中每個圖像是輪廓圖像的一小部分,通過改變x和y的限制以及寬高比。matplotlib savefig性能,在循環內節省多個PNG
因此,循環中沒有繪圖數據發生變化,只有軸限制和縱橫比在每個png圖像之間變化。
以下MWE在「無花果」文件夾中創建70個PNG圖像,展示簡化的想法。大約80%的運行時間被fig.savefig('figs/'+filename)
佔用。
我看着下面沒有想出一個改進:
- 到
matplotlib
的替代,重點是速度 - 我一直在努力尋找任何例子/輪廓/表面圖的文檔有類似的要求 - 多處理 - 類似的問題我在這裏看到似乎要求
fig = plt.figure()
和ax.imshow
在循環中被調用,因爲無花果和斧頭不能被醃製。在我的情況下,這將比通過實現多處理獲得的任何速度收益更昂貴。
我很感謝您的任何見解或建議。
import numpy as np
import matplotlib as mpl
mpl.use('agg')
import matplotlib.pyplot as plt
import time, os
def make_plot(x, y, fix, ax):
aspect = np.random.random(1)+y/2.0-x
xrand = np.random.random(2)*x
xlim = [min(xrand), max(xrand)]
yrand = np.random.random(2)*y
ylim = [min(yrand), max(yrand)]
filename = '{:d}_{:d}.png'.format(x,y)
ax.set_aspect(abs(aspect[0]))
ax.set_xlim(xlim)
ax.set_ylim(ylim)
fig.savefig('figs/'+filename)
if not os.path.isdir('figs'):
os.makedirs('figs')
data = np.random.rand(25, 25)
fig = plt.figure()
ax = fig.add_axes([0., 0., 1., 1.])
# in the real case, imshow is an expensive calculation which can't be put inside the loop
ax.imshow(data, interpolation='nearest')
tstart = time.clock()
for i in range(1, 8):
for j in range(3, 13):
make_plot(i, j, fig, ax)
print('took {:.2f} seconds'.format(time.clock()-tstart))