gpt4 book ai didi

python - 在 matplotlib 中,我可以使用多个 CPU 来加速绘制许多子图和数据点吗?

转载 作者:行者123 更新时间:2023-12-05 02:19:47 25 4
gpt4 key购买 nike

我正在创建一个包含大约一百个子图/轴的图形,每个子图/轴都有几千个数据点。目前,我正在遍历每个子图并使用 plt.scatter 放置点。但是,这很慢。是否可以使用多个 CPU 来加快绘图速度,方法是为每个子图分配一个核心或在单个子图中绘制数据点?

到目前为止,我已经尝试使用 joblib 来使用并行进程来创建子图,但不是在同一图中创建新的子图,而是为每个子图生成一个新图。我已经尝试使用后端 PDFQt5AggAgg。这是我的代码的一个简化示例。

import matplotlib as mpl
mpl.use('PDF')
import seaborn as sns
import matplotlib.pyplot as plt
from joblib import Parallel, delayed

def plotter(name, df, ax):
ax.scatter(df['petal_length'], df['sepal_length'])

iris = sns.load_dataset('iris')
fig, axes = plt.subplots(3,1)

Parallel(n_jobs=2)(delayed(plotter)
(species_name, species_df, ax)
for (species_name, species_df), ax in zip(iris.groupby('species'), axes.ravel()))

fig.savefig('test.pdf')

设置 n_jobs=1 有效,然后所有点都绘制在同一图中。然而,将它增加到 1 以上会创建四个数字:一个是我用 plt.subplots 启动的,然后每次调用 ax.scatter 时一个。

由于我将轴从第一个图形传递到 plotter,所以我不确定如何/为什么创建其他图形。 matplotlib 中是否有一些回退,如果指定的图形被另一个绘图进程“锁定”,会导致自动创建新图形?

如有任何关于如何改进我当前方法或通过替代方法实现加速的建议,我们将不胜感激。

最佳答案

Joblib 的 parallel 使用 multiprocessing 模块来生成进程,因此每个作业将在不同的进程中运行。这就是为什么您会为每项工作获得一个新数字。进程不共享任何内存,就像线程一样,因此它们无权访问原始图形。

您可能会尝试使用线程,但由于全局解释器锁 (GIL),您能否获得任何速度提升值得怀疑。

为了加快绘图速度,您可以尝试避免使用 pyplot。它增加了一些开销和一个辅助线程,用于在每个绘图命令后重新绘制绘图。这主要是为了使例如 ipython 感觉更像 Matlab - 但对于速度来说这很糟糕。如果您只使用 matplotlib,那么您可以选择只在完成绘图后绘制绘图,这可能会节省大量时间。

注意:@Faultier 在评论中提到您可以使用 pyplot.ion()pyplot.ioff() 启用和禁用交互式绘图。

关于python - 在 matplotlib 中,我可以使用多个 CPU 来加速绘制许多子图和数据点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41434657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com