Python 如何获得多处理结果?
我希望在多重处理后将工作结果存储在特定变量中,如下所示 或者,我想将作业结果保存为csv文件。我可以知道怎么做吗 这是我的代码: (我想获取“df4”和“df7”数据并保存csv文件)Python 如何获得多处理结果?,python,python-multiprocessing,Python,Python Multiprocessing,我希望在多重处理后将工作结果存储在特定变量中,如下所示 或者,我想将作业结果保存为csv文件。我可以知道怎么做吗 这是我的代码: (我想获取“df4”和“df7”数据并保存csv文件) 看起来您的函数cal1和cal2是相同的,只是它们试图将结果分配给一些不同的全局变量。这是行不通的,因为当您在子流程中运行它们时,它们将在子流程中分配该全局变量,但这对启动它们的主流程没有任何影响 如果要跨多个进程将函数映射到多个输入范围,可以使用进程和 例如: def-cal(输入列表): 开始=时间。时间()
看起来您的函数
cal1
和cal2
是相同的,只是它们试图将结果分配给一些不同的全局变量。这是行不通的,因为当您在子流程中运行它们时,它们将在子流程中分配该全局变量,但这对启动它们的主流程没有任何影响
如果要跨多个进程将函数映射到多个输入范围,可以使用进程和
例如:
def-cal(输入列表):
开始=时间。时间()
对于枚举中的i,t(输入列表):
df2=pd.DataFrame(df1[df1['resion']==t])#'df1'是原始数据
如果i%2==0:
打印(“cal1函数处理:”,i)
end=time.time()
打印(结束-开始)
其他:
通过
对于n,枚举中的d(日期):
df3=pd.DataFrame(df2[df2['date']=d])
df3['number']=df3['price'].排名(pct=True,升序=False)
df4=df4.append(pd.DataFrame(df3))
#我没有修改您的原始代码,但我不确定这一点
#是怎么做的,因为你一次通过
#外环。我还没有仔细检查你到底想做什么
#但我怀疑这也是错误的。
返回df4
然后创建一个流程池,您可以按照自己的意愿分割输入(或者,通过一些调整,您可以让pool.map
为您分割输入,然后将map的输出减少为单个输出):
pool=multiprocessing.pool(2)
dfs=pool.map(cal[list1.iloc[0:10],list1.iloc[10:20]]
这只是为了让你开始。我可能还会做一些其他不同的事情。这是否回答了您的问题?谢谢你的建议。我试过你告诉我的密码。但是,“for循环”不起作用。只有第一个“列表”起作用。。。。。。(我的意思是,list1.iloc[0:1],list1.iloc[10:11])是的,请参阅我在代码副本中添加的注释。您在
cal1
和cal2
中对循环进行编码的方式有缺陷,因为它在一次迭代后从循环返回,但这与多处理问题无关。感谢您的解释。这很有帮助。
import pandas as pd
from pandas import DataFrame
import time
import multiprocessing
df2 = pd.DataFrame()
df3 = pd.DataFrame()
df4 = pd.DataFrame()
df5 = pd.DataFrame()
df6 = pd.DataFrame()
df7 = pd.DataFrame()
df8 = pd.DataFrame()
date = '2011-03', '2011-02' ........ '2021-03' #There are 120 list.
list1 = df1['resion'].drop_duplicates() # There are 20 list. 'df1' is original data
#I'd like to divide the list and work on it.
list11 = list1.iloc[0:10]
list12 = list1.iloc[10:20]
#It's a function using 'list11'.
def cal1():
global df2
global df3
global df4
start = time.time()
for i, t in enumerate(list11):
df2 = pd.DataFrame(df1[df1['resion'] == t]) #'df1' is original data
if i%2 == 0:
print ("cal1 function processing: ", i)
end = time.time()
print (end-start)
else:
pass
for n, d in enumerate(date):
df3 = pd.DataFrame(df2[df2['date'] == d])
df3['number'] = df3['price'].rank(pct=True, ascending = False )
df4 = df4.append(pd.DataFrame(df3))
return df4
#It's a function using 'list12'.
def cal2():
global df5
global df6
global df7
start = time.time()
for i, t in enumerate(list12):
df5 = pd.DataFrame(df1[df1['resion'] == t]) #'df1' is original data
if i%2 == 0:
print ("cal1 function processing: ", i)
end = time.time()
print (end-start)
else:
pass
for n, d in enumerate(date):
df6 = pd.DataFrame(df5[df5['date'] == d])
df6['number'] = df6['price'].rank(pct=True, ascending = False )
df7 = df7.append(pd.DataFrame(df6))
return df7
## Multiprocessing code
if __name__ == "__main__":
# creating processes
p1 = multiprocessing.Process(target=cal1, args=())
p2 = multiprocessing.Process(target=cal2, args=())
# starting process 1
p1.start()
# starting process 2
p2.start()
# wait until process 1 is finished
p1.join()
# wait until process 2 is finished
p2.join()
# both processes finished
print("Done!")