你不会打败subplots
任何大量的金额。创建新轴是一项相当昂贵的操作,每次您都会创建 32 个轴。然而,它只完成一次。
创建新的图形和轴真的是您的瓶颈吗?如果是这样,您可能做错了什么。
如果您尝试创建动画,只需更新艺术家(例如image.set_data
等)并重新绘制,而不是每次都制作新的图形和轴。
(Also, axes = plt.subplots(4, 8)
是不正确的。axes
将是一个元组,而不是您当前编写的轴对象序列。subplots
返回一个图形实例和一个轴数组。它应该是fig, axes = plt.subplots(...)
.)
只是为了扩展我下面关于酸洗的评论:
当您更改不相关的参数时,缓存“昂贵”的结果通常很方便。这在科学“脚本”中尤其常见,您通常会进行一些相当慢的数据解析或中间计算以及半交互式“调整”的一组相关参数。
只需注释掉几行并显式保存/加载腌制结果并没有什么问题。
然而,我发现保留一个自动执行此操作的装饰器很方便。在许多情况下,有更好的方法可以做到这一点,但对于一刀切的解决方案来说,它非常方便:
import os
import cPickle as pickle
from functools import wraps
class Cached(object):
def __init__(self, filename):
self.filename = filename
def __call__(self, func):
@wraps(func)
def new_func(*args, **kwargs):
if not os.path.exists(self.filename):
results = func(*args, **kwargs)
with open(self.filename, 'w') as outfile:
pickle.dump(results, outfile, pickle.HIGHEST_PROTOCOL)
else:
with open(self.filename, 'r') as infile:
results = pickle.load(infile)
return results
return new_func
然后你可以做类似的事情(假设上面的类位于utilities.py
):
import matplotlib.pyplot as plt
from utilities import Cached
@Cached('temp.pkl')
def setup():
fig, axes = plt.subplots(8, 4)
# And perhaps some other data parsing/whatever
return fig, axes
fig, axes = setup()
for ax in axes.flat:
ax.plot(range(10))
plt.show()
仅当给定的文件名("temp.pkl"
) 不存在,并且缓存结果存储在temp.pkl
否则将被加载。这适用于任何可以腌制的东西,而不仅仅是 matplotlib 图形。
但要小心使用已保存的状态。如果你改变什么setup
执行并重新运行,将返回“旧”结果!如果更改包装函数的功能,请务必手动删除缓存文件。
当然,如果你只是在一个地方做这件事,那就有点矫枉过正了。不过,如果您发现自己经常缓存中间结果,那么拥有它会很方便。