0

Я создаю одну фигуру с примерно сотнями подсетей/осей, каждая с несколькими тысячами точек данных. В настоящее время я прохожу через каждый подзаговор и используя plt.scatter, чтобы поместить точки. Однако это довольно медленно. Можно ли использовать несколько процессоров для ускорения построения графика, разделив рабочую силу либо на одно ядро ​​на подзадачу, либо с точки зрения построения точек данных в пределах одного подзаголовка?В matplotlib можно ли использовать несколько процессоров для ускорения построения множества подзадач и точек данных?

До сих пор я пытался использовать joblib для использования параллельных процессов для создания подзаголовков, но вместо создания новых подзаголовков на одной фигуре он генерирует новую фигуру для каждого подзаголовка. Я пробовал с бэкендами PDF, Qt5Agg и Agg. Вот упрощенный пример моего кода.

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 работы, все точки, то график в пределах одной и той же фигуры. Однако, увеличивая его до одного, вы создаете четыре цифры: один, который я начинаю с plt.subplots, а затем один за каждый раз вызывается ax.scatter.

Поскольку я передаю оси с первой цифры до plotter, я не уверен, как/почему создаются дополнительные фигуры. Есть ли какой-то резерв в matplotlib, который заставляет новые цифры создаваться автоматически, если указанная цифра «заблокирована» другим процессом построения графика?

Любые советы о том, как улучшить мой нынешний подход или добиться ускорения с помощью альтернативных подходов, оценены.

ответ

2

parallel Joblib использует модуль multiprocessing для процессов нереста, поэтому каждое задание будет выполняться в другом процессе. Вот почему вы получите новую цифру для каждой работы. Процессы не имеют никакой памяти, например, потоки, поэтому у них нет доступа к исходной фигуре.

Возможно, вы можете попробовать использовать потоки, но сомнительно, если вы получите какую-либо прирост скорости из-за глобальной блокировки интерпретатора (GIL).

Чтобы ускорить построение графика, возможно, вы попытаетесь избежать использования pyplot. Он добавляет некоторые накладные расходы и вспомогательный поток, который перерисовывает график после каждой команды построения. Это в основном связано с тем, что, например, ipython больше похож на Matlab, но для скорости это плохо. Если вы используете только matplotlib, вы можете выбрать рисование сюжета только после его завершения, и это, вероятно, сэкономит значительное время.

Примечание: @Faultier упоминает в комментарии, что вы можете включить или отключить интерактивное построение с pyplot.ion() и pyplot.ioff().

+1

Возможно, было бы практически невозможно создать отдельные фигуры, временно сохранить их и, наконец, загрузить их в комбинированную фигуру? Для увеличения скорости 'plt.ioff()' также помогает, так как избегается автоматическое перерисовка. – Faultier

+0

@Faultier @ J.P.Petersen Спасибо! Я уже использую 'plt.ioff' (не входит в пример в вопросе, извините), я никогда не показываю фигуру, просто создаю ее и сохраняю как PDF. Будет ли у меня до сих пор значительное увеличение скорости от использования 'matplotlib' напрямую и вообще избежать« pyplot »? –

+0

@Faultier Что вы имеете в виду при создании отдельных фигур и их объединении? Из того, что [я прочитал] (http://stackoverflow.com/questions/6309472/matplotlib-can-i-create-axessubplot-objects-then-add-them-to-a-figure-instance?noredirect11&lq= 1), это громоздко (если вообще возможно) и официально не поддерживается для создания осей matplotlib отдельно и объединить их в фигуре. Вы имеете в виду сохранение отдельных PDF-файлов, а затем сшивание их вместе?Я рассматриваю это, но не уверен, какая лучшая кроссплатформенная (к сожалению, необходимая для меня) библиотека python для реализации PDF-строчки. –