我正在尝试编写一个函数来并行读取大量文件。我的代码如下:
import numpy as np
from multiprocessing import Pool
from functools import partial
def read_profiles(stamp,name,cols,*args):
#This function reads each file.
filename=name + '-' + str(int(timestep[stamp])) + '.dat'
with open(filename) as f:
xloc = 0
for line in f:
ele = line.rstrip("\n").split()
for g in len(args):
args[g][stamp,xloc] = float(ele[cols[g]])
xloc = xloc + 1
timestep = np.arange(1,51)
x = np.ndarray(shape=(len(timestep),1001))
Ex = np.ndarray(shape=(len(timestep),1001))
j1 = np.ndarray(shape=(len(timestep),1001))
j2 = np.ndarray(shape=(len(timestep),1001))
j3 = np.ndarray(shape=(len(timestep),1001))
j4 = np.ndarray(shape=(len(timestep),1001))
terse_args = [x,Ex]
curr_args = [j1,j2,j3,j4]
with Pool(4) as pool:
pool.map(partial(read_profiles,name='terse',cols=[0,2],*args=*terse_args),range(len(timestep)))
pool.map(partial(read_profiles,name='current',cols=[1,2,3,4],*args=*curr_args),range(len(timestep)))
请注意,最后一个参数(*args)采用未知数量的二维数组。 上面的代码给我一个错误,指出 *args 处的“无效语法”。我尝试将它们作为不带关键字的位置参数传递,但随后出现错误,提示“名称”有多个值。
有谁知道如何在使用池时包含任意数量的二维数组作为函数的参数.map 和部分?
如果需要任何其他信息,请告诉我。 谢谢。
错误在于你试图解包
*args
的方式,以及你在
pool.map
中传递参数的方式。你不需要使用
*args
来传递
pool.map
中的额外参数。
functools.partial
可以处理这个问题。
下面是你的代码的修正版本:
import numpy as np
from multiprocessing import Pool
from functools import partial
def read_profiles(stamp, name, cols, *data_arrays):
# 此函数读取每个文件。
filename = name + '-' + str(int(timestep[stamp])) + '.dat'
with open(filename) as f:
xloc = 0
for line in f:
ele = line.rstrip("\n").split()
for g, data_array in enumerate(data_arrays):
data_array[stamp, xloc] = float(ele[cols[g]])
xloc = xloc + 1
timestep = np.arange(1, 51)
x = np.ndarray(shape=(len(timestep), 1001))
Ex = np.ndarray(shape=(len(timestep), 1001))
j1 = np.ndarray(shape=(len(timestep), 1001))
j2 = np.ndarray(shape=(len(timestep), 1001))
j3 = np.ndarray(shape=(len(timestep), 1001))
j4 = np.ndarray(shape=(len(timestep), 1001))
terse_args = [x, Ex]
curr_args = [j1, j2, j3, j4]
with Pool(4) as pool:
pool.map(partial(read_profiles, name='terse', cols=[0, 2], *terse_args), range(len(timestep)))
pool.map(partial(read_profiles, name='current', cols=[1, 2, 3, 4], *curr_args), range(len(timestep)))
说明:
-
partial
用于固定参数: 我们使用functools.partial
来创建一个新的可调用对象,它将name
、cols
和data_arrays
作为参数传递给read_profiles
函数。 -
*data_arrays
接受可变数量的参数: 在read_profiles
函数中,我们使用*data_arrays
来接受任意数量的数组参数。然后,我们遍历这些数组,并使用提供的cols
索引将值存储在其中。 -
直接传递数组:
在调用
pool.map
时,我们直接传递terse_args
和curr_args
列表中的数组,而不是尝试解包它们。partial
函数会将这些数组作为附加参数传递给read_profiles
。
通过这些更改,你的代码应该能够正确地并行读取文件并将数据存储在提供的数组中。
标签:python,python-3.x,numpy,multiprocessing From: 78785636