Я пытаюсь ознакомиться с библиотекой Scoop (документация здесь: https://media.readthedocs.org/pdf/scoop/0.7/scoop.pdf), чтобы узнать, как выполнять статистические вычисления параллельно, используя, в частности, функцию futures.map.
Как таковаяВо-первых, я хотел бы попытаться запустить простую линейную регрессию и оценить разницу в производительности между последовательными и параллельными вычислениями, используя 10000000 точек данных (4 функции, 1 целевая переменная), случайно сгенерированных из нормального распределения.
Это мой код:
import pandas as pd
import numpy as np
import random
from scoop import futures
import statsmodels.api as sm
from time import time
def linreg(vals):
global model
model = sm.OLS(y_vals,X_vals).fit()
return model
print(model.summary())
if __name__ == '__main__':
random.seed(42)
vals = pd.DataFrame(np.random.normal(loc = 3, scale = 100, size =(10000000,5)))
vals.columns = ['dep', 'ind1', 'ind2', 'ind3', 'ind4']
y_vals = vals['dep']
X_vals = vals[['ind1', 'ind2', 'ind3', 'ind4']]
bt = time()
model_vals = list(map(linreg, [1,2,3]))
mval = model_vals[0]
print(mval.summary())
serial_time = time() - bt
bt1 = time()
model_vals_1 = list(futures.map(linreg, [1,2,3]))
mval_1 = model_vals_1[0]
print(mval_1.summary())
parallel_time = time() - bt1
print(serial_time, parallel_time)
Однако после этого сводная регрессия действительно выводится в последовательном порядке - с помощью стандартной функции карты Python - ошибка:
Traceback(последний вызов был последним): Файл "C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ runpy.py", строка 193, в _run_module_as_main " main ", mod_spec) Файл" C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ runpy.py ", строка 85, в _run_code exec (код, run_globals) Файл "C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages \ scoop \ bootstrap__main __. py", строка 302, в файле b.main () "C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages \ scoop \ bootstrap__main __. Py ", строка 92, в основном файле self.run ()" C: \ Users \ "niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages \ scoop \ bootstrap__main __. py ", строка 290, в файле futures_startup () запускается" C: \ Users \ niccolo.gentile \ AppData \Локальный \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages \ scoop \ bootstrap__main __. Py ", строка 271, в futures_startup run_name =" main"Файл" C: \ Users \ niccolo.gentile \AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages \ scoop \ futures.py ", строка 64, в _startup result = _controller.switch (rootFuture, * args, ** kargs) Файл" C: \Пользователи \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages \ scoop_control.py ", строка 253, в runController поднять файл future.exceptionValue "C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages \ scoop_control.py", строка 127, в runFuture future.resultValue =future.callable (* future.args, ** future.kargs) Файл "C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ runpy.py", строка 263, в run_pathpkg_name = pkg_name, script_name = fname) Файл "C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ runpy.py", строка 96, в _run_module_code имя_модуля, mod_spec, pkg_name, имя_скрипта) Файл "C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ runpy.py", строка 85, в файле _run_code exec (code, run_globals), файл "Scoop_map_linear_regression1.py", строка33, в model_vals_1 = list (futures.map (linreg, [1,2,3])) файл "C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages\ scoop \ futures.py ", строка 102, в _mapGenerator для будущего в _waitAll (* futures): файл "C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages \ scoop \ futures.py", строка 358, в _waitAll для f в_waitAny (future): Файл "C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages \ scoop \ futures.py", строка 335, в _waitAny поднять childFuture.exceptionValueNameError: имя 'y_vals' не определено
создается впоследствии.Это означает, что код останавливается на model_vals_1 = list(futures.map(linreg, [1,2,3]))
.
Я также пытался запустить его с картой оба раза, и действительно ошибка не появляется.
Я также указываю, что скрипт был корректнозапускается с:
python -m scoop Scoop_map_linear_regression1.py
из командной строки Anaconda Prompt.
Действительно, если он будет запущен без параметра -m scoop, он не будет распараллелен и будет фактически выполняться, а просто использует в два раза встроенную в Python функцию map, как вы будете получать отчеты в Предупреждениях.То есть, без указания параметра -m scoop при его запуске, futures.map будет заменен на map.
Моя цель - вместо этого запустить его параллельно, используя точно futures.map, и оценить улучшение производительности.,
Указание этого во избежание любого другого аналогичного ответа и последующего приостановления.
Любой комментарий высоко ценится и приветствуется.