我正在尝试熟悉Scoop库(在此处的文档:https://media.readthedocs.org/pdf/scoop/0.7/scoop.pdf),以学习如何并行使用统计信息,尤其是使用futures.map函数。
这样,首先,我想尝试运行一个简单的线性回归,并使用从法线中随机生成的10000000个数据点(4个特征,一个目标变量)来评估串行和并行计算之间的性能差异。分布。
这是我的代码:
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的标准map函数以串行方式生成的:错误:
回溯(最近通话最近): _run_module_as_main中的第193行的文件“ C:\ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tensorenviron \ lib \ runpy.py” “ 主要”,mod_spec) 文件“ C:\ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tensorenviron \ lib \ runpy.py”,第85行,在_run_code中 exec(代码,run_globals) 第302行的文件“ C:\ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tensorenviron \ lib \ site-packages \ scoop \ bootstrap__main __。py” b.main() 主目录中的文件“ C:\ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tensorenviron \ lib \ site-packages \ scoop \ bootstrap__main __。py” self.run() 正在运行的文件“ C:\ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tensorenviron \ lib \ site-packages \ scoop \ bootstrap__main __。py”,正在运行 futures_startup() 在futures_startup中,文件“ C:\ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tensorenviron \ lib \ site-packages \ scoop \ bootstrap__main __。py” run_name =“ 主要” _startup中的文件“ C:\ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tensorenviron \ lib \ site-packages \ scoop \ futures.py”,第64行 结果= _controller.switch(rootFuture,* args,** kargs) 在runController中的文件“ C:\ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tensorenviron \ lib \ site-packages \ scoop_control.py”,第253行 提高future.exceptionValue 在runFuture的第127行中,文件“ C:\ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tensorenviron \ lib \ site-packages \ scoop_control.py” future.resultValue = future.callable(* future.args,** future.kargs) 文件“ C:\ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tensorenviron \ lib \ runpy.py”,行263,在run_path中 pkg_name = pkg_name,script_name = fname) 文件“ C:\ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tensorenviron \ lib \ runpy.py”,第96行,在_run_module_code中 mod_name,mod_spec,pkg_name,script_name) 文件“ C:\ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tensorenviron \ lib \ runpy.py”,第85行,在_run_code中 exec(代码,run_globals) 文件“ Scoop_map_linear_regression1.py”,第33行,在 model_vals_1 =列表(futures.map(linreg,[1,2,3])) _mapGenerator中的第102行的文件“ C:\ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tensorenviron \ lib \ site-packages \ scoop \ futures.py” 将来在_waitAll(* futures)中: _waitAll中的第358行的文件“ C:\ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tensorenviron \ lib \ site-packages \ scoop \ futures.py” 对于_waitAny中的f(未来): 文件“ C:\ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tensorenviron \ lib \ site-packages \ scoop \ futures.py”,行335,在_waitAny中 提高childFuture.exceptionValue NameError:名称“ y_vals”未定义
随后产生。这意味着代码在model_vals_1 = list(futures.map(linreg, [1,2,3]))
处停止。
我还尝试了两次使用map来运行它,实际上并没有出现错误。
我还指定脚本已通过以下方式正确启动:
python -m scoop Scoop_map_linear_regression1.py
从Anaconda提示符命令行输入。
的确,如果不带-m scoop参数启动它,它将不会并行化并实际上会运行,而只是使用Python内置的map函数的两倍,就像在Warnings中得到的一样。也就是说,在启动时不指定-m scoop参数,会将futures.map替换为map。
我的目标是使用确切的futures.map并行运行它,并评估性能改进。
指定它以避免任何其他类似的答案,因此被搁置。
任何评论都将受到高度赞赏和欢迎。