Python并行计算
我正在尝试熟悉库中的独家新闻(这里的文档:),以了解如何并行执行统计计算,尤其是使用futures.map函数 因此,首先,我想尝试运行一个简单的线性回归,并使用从正态分布随机生成的10000000个数据点(4个特征,1个目标变量),评估串行和并行计算之间的性能差异 这是我的代码:Python并行计算,python,machine-learning,parallel-processing,linear-regression,python-scoop,Python,Machine Learning,Parallel Processing,Linear Regression,Python Scoop,我正在尝试熟悉库中的独家新闻(这里的文档:),以了解如何并行执行统计计算,尤其是使用futures.map函数 因此,首先,我想尝试运行一个简单的线性回归,并使用从正态分布随机生成的10000000个数据点(4个特征,1个目标变量),评估串行和并行计算之间的性能差异 这是我的代码: import pandas as pd import numpy as np import random from scoop import futures import statsmodels.api as sm
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行,位于主运行模块中
“main”,模块规格)
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\runpy.py”,第85行,运行代码
exec(代码、运行\全局)
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site packages\scoop\bootstrap\uuuuu main\uuuuuu.py”,第302行,在
b、 main()
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site packages\scoop\bootstrap\uuuuu main\uuuuuu.py”,第92行,主目录
self.run()
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site packages\scoop\bootstrap\uuuuu main\uuuuuu.py”,第290行,正在运行
期货与创业公司()
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site packages\scoop\bootstrap\uuuuu main\uuuuuu.py”,第271行,在futures\u启动中
运行_name=“main”
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site packages\scoop\futures.py”,第64行,在\u启动中
结果=_controller.switch(rootFuture,*args,**kargs)
runController中的文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site packages\scoop\u control.py”,第253行
提高未来价值
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site packages\scoop\u 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行,在运行路径中
pkg_name=pkg_name,script_name=fname)
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\runpy.py”,第96行,在运行模块代码中
模块名称、模块规格、组件名称、脚本名称)
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\runpy.py”,第85行,运行代码
exec(代码、运行\全局)
文件“Scoop\u map\u linear\u 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行,在\ U mapGenerator中
对于未来的_waitAll(*期货):
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site packages\scoop\futures.py”,第358行,在
对于f in_waitAny(未来):
文件“C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site packages\scoop\futures.py”,第335行,在waitAny
提高childFuture.exceptionValue
名称错误:未定义名称“y_vals”
是后来生产的。这意味着代码在model\u vals\u 1=list(futures.map(linreg[1,2,3])
处停止
我也试着用map运行了两次,但确实没有出现错误
我还指定脚本已通过以下方式正确启动:
python -m scoop Scoop_map_linear_regression1.py
从Anaconda提示符命令行
事实上,如果在没有-m scoop参数的情况下启动它,它将不会被并行化并实际运行,而只是使用内置Python的map函数的两倍,就像在警告中报告的那样。也就是说,在启动时不指定-m scoop参数,futures.map将被map替换
我的目标是使用futures.map并行运行它,并评估性能改进
指定它以避免任何其他类似的答案和随后的搁置
非常感谢并欢迎您的任何评论。当我将size=1000时,您的代码在我的笔记本电脑上运行完成,没有错误。嗨,詹姆斯,谢谢您的回复。实际上,我已经尝试过使用size=1000,但仍然得到相同的错误。您是否使用相同的参数从命令终端启动它?如果是,请您告诉我并行时间是否小于串行时间,以及两个回归输出是否相等(例如R平方、调整R平方、F统计等)?谢谢。下面的输出是一个答案,因为评论不允许格式化。亲爱的菲利普斯,我昨天看到了你的回复,但现在才能回复。实际上,您没有使用-m scoop参数运行该命令,这意味着没有启动scoop。因此,您只需运行两次Python的内置映射函数(如您收到的警告中所指定的),在我的问题中,我说的确实没有出现bug。无论如何,非常感谢。顺便问一下,@JamesPhillips,既然我的问题确实仍然相关,那么如何才能取消这种暂停状态?