如何在python中的多处理目标函数中对全局数据帧执行



我有以下代码。我想使用python多进程在全局数据帧df上使用calculate_mi函数来计算所有对的值。

from multiprocess import Pool
def calculate_mi(pair):
global df
from pyitlib import discrete_random_variable as drv
import numpy as np
i, j = pair
val = ( 2*drv.information_mutual(df[i].values.astype(np.int32), df[j].values.astype(np.int32)) ) / ( drv.entropy(df[i].values.astype(np.int32)) + drv.entropy(df[j].values.astype(np.int32)) )
return (i,j), val
def calculate_value(t_df):
global df
df = t_df
all_pair = [('1', '2'), ('1', '3'), ('2', '1'), ('2', '3'), ('3', '1'), ('3', '2')]
pool = Pool()
pair_value_list = pool.map(calculate_mi, all_pair)
pool.close()
print(pair_value_list)
def calc():
data = {'1':[1, 0, 1, 1],
'2':[0, 1, 1, 0],
'3':[1, 1, 0, 1],
'0':[0, 1, 0, 1] }
t_df = pd.DataFrame(data)
calculate_value(t_df)
if __name__ == '__main__':
calc()

这段代码为我提供了googlecolab平台中的预期输出。但当我在本地机器上运行它时,它会出现以下错误。(我使用的是windows 10,anaconda,jupyter笔记本,python 3.6.9(。我该如何解决这个问题,或者有其他方法吗?RemoteTraceback Traceback(最后一次调用(。。。名称错误:名称"df"未定义

首先,有两件事:

  1. 它应该是:from multiprocessing import Pool(而不是from multiprocess(
  2. 您似乎忽略了pandas库的导入

继续。。。

问题是,在Windows下,新进程的创建不是使用fork调用完成的,因此子进程不会自动继承全局变量(如df(。因此,在创建Pool:时,必须使用初始化器初始化每个子进程,使全局变量df正确初始化

from multiprocessing import Pool
import pandas as pd
def calculate_mi(pair):
global df
from pyitlib import discrete_random_variable as drv
import numpy as np
i, j = pair
val = ( 2*drv.information_mutual(df[i].values.astype(np.int32), df[j].values.astype(np.int32)) ) / ( drv.entropy(df[i].values.astype(np.int32)) + drv.entropy(df[j].values.astype(np.int32)) )
return (i,j), val
# initialize global variable df for each sub-process
def initpool(t_df):
global df
df = t_df
def calculate_value(t_df):
all_pair = [('1', '2'), ('1', '3'), ('2', '1'), ('2', '3'), ('3', '1'), ('3', '2')]
# make sure each sub-process has global variable df properly initialized:    
pool = Pool(initializer=initpool, initargs=(t_df,))
pair_value_list = pool.map(calculate_mi, all_pair)
pool.close()
print(pair_value_list)
def calc():
data = {'1':[1, 0, 1, 1],
'2':[0, 1, 1, 0],
'3':[1, 1, 0, 1],
'0':[0, 1, 0, 1] }
t_df = pd.DataFrame(data)
calculate_value(t_df)
if __name__ == '__main__':
calc()

相关内容

  • 没有找到相关文章

最新更新