我正在尝试熟悉 Scoop 库(此处的文档:https://media.readthedocs.org/pdf/scoop/0.7/scoop.pdf 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 的标准映射函数串行生成的,出现错误:
回溯(最近一次调用最后一次):
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\runpy.py”,第 193 行,在 _run_module_as_main 中
”main“,mod_spec)
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\runpy.py”,第 85 行,在 _run_code 中
执行(代码,run_globals)
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop\bootstrap__main__.py”,第 302 行,位于
b.main()
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop\bootstrap__main__.py”,第 92 行,在 main 中
自我运行()
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop\bootstrap__main__.py”,第 290 行,运行中
futures_startup()
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop\bootstrap__main__.py”,第 271 行,在 futures_startup 中
运行名称=“main”
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop\futures.py”,第 64 行,在 _startup 中
结果 = _controller.switch(rootFuture, *args, **kargs)
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop_control.py”,第 253 行,在 runController 中
引发 future.ExceptionValue
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\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\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 中
执行(代码,run_globals)
文件“Scoop_map_线性_regression1.py”,第 33 行,位于
model_vals_1 = list(futures.map(linreg, [1,2,3]))
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop\futures.py”,第 102 行,在 _mapGenerator 中
对于 _waitAll(*futures) 中的未来:
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop\futures.py”,第 358 行,在 _waitAll 中
对于 _waitAny(future) 中的 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]))
.
我也尝试使用地图运行它两次,并且确实没有出现错误。
我还指定该脚本已正确启动:
python -m scoop Scoop_map_linear_regression1.py
从 Anaconda Prompt 命令行。
事实上,如果在没有 -m scoop 参数的情况下启动它,它不会并行化并且实际上会运行,而只是使用 Python 内置映射函数的两倍,就像在警告中报告的那样。也就是说,如果启动时不指定 -m scoop 参数,futures.map 将被 map 替换。
我的目标是使用 futures.map 并行运行它,并评估性能改进。
指定它以避免任何其他类似的答案并因此被搁置。
任何评论都受到高度赞赏和欢迎。