【问题标题】:Python Multiprocessing, TypeErrorPython 多处理,TypeError
【发布时间】:2018-06-07 08:38:44
【问题描述】:

我是多处理新手,需要您的帮助。

我有四个变量,每个变量最多可以取 4 个值(整数或浮点数),我将它们全部存储在一个名为 par=[A, B, C, D] 的列表中。 (见下文)

我已经用par = itertools.product(*par) 创建了一个可能的组合列表。

然后,我调用一个函数func1,它接受这些参数和其他一些参数并计算东西。使用func1 的结果,我调用另一个函数来计算内容然后写入文件。

我想将这些作为一个整体与multiprocessing.Pool 并行运行,我想将func1func2 嵌入到另一个函数中,称为func_run,并将其映射到我在上面创建的列表par

总而言之,我的代码如下所示:

#values that I will use for func1
    
r   = np.logspace(np.log10(5),np.log10(300),300)
T   = 200*r

#Parameters for the sim
A = [0.1, 0.05, 0.001, 0.005]
B = [0.005, 0.025, 0.05, 0.1]
C = [20, 60, 100, 200]
D = [10, 20, 40, 80]

#Store them in a list
par = [A, B, C, D]

#Create a list with all combinations
par = list(itertools.product(*par))             

def func_run(param):
    for i in range(len(param)):

# Call func1
        values = func1(param[i][0],param[i][1],param[i][2], param[i][3], r, T)

        x = values[0]
        y = values[1]
        # and so on
        
# Call func2
        results = func2(x,y,...)

        z = results[0]
        w = results[1]
        # and so on

        data_dict = {'result 1': [param[i][0]], 'result 2' : [param[i][1]]}

    df = pd.DataFrame(data=data_dict)
        with open(filename, 'a') as f:
                df.to_csv(f, header=False)
      
    return

然后,我用multiprocessing 调用func_run

from multiprocessing import Pool
pool = Pool(processes=4)
results = pool.map(func_run, par)

结果,我得到了一个TypeError,带有回溯:

---------------------------------------------------------------------------
RemoteTraceback                           Traceback (most recent call last)
RemoteTraceback: 
"""
Traceback (most recent call last):
  File "/home/user/anaconda3/lib/python3.6/multiprocessing/pool.py", line 119, in worker
result = (True, func(*args, **kwds))
  File "/home/user/anaconda3/lib/python3.6/multiprocessing/pool.py", line 44, in mapstar
return list(map(*args))
  File "<ipython-input-14-5ce94acfd95e>", line 5, in run
values = calc_val(param[i][0],param[i][1],param[i][2], param[i][3], r, T)
TypeError: 'float' object is not subscriptable
"""

The above exception was the direct cause of the following exception:

TypeError                                 Traceback (most recent call last)
<ipython-input-15-f45146f68f66> in <module>()
      1 pool    = Pool(processes=4)
----> 2 test    = pool.map(run,par)

~/anaconda3/lib/python3.6/multiprocessing/pool.py in map(self, func, iterable, chunksize)
264         in a list that is returned.
265         '''
--> 266         return self._map_async(func, iterable, mapstar, chunksize).get()
267 
268     def starmap(self, func, iterable, chunksize=None):

~/anaconda3/lib/python3.6/multiprocessing/pool.py in get(self, timeout)
642             return self._value
643         else:
--> 644             raise self._value
645 
646     def _set(self, i, obj):

TypeError: 'float' object is not subscriptable

不幸的是,不可能添加整个函数以及它们在做什么,因为它们有数百行。我希望你能得到这种感觉,即使你自己无法真正重现它。

是否可以通过多处理运行类似的东西,或者我需要不同的方法? 如果有人能帮助我理解错误并使其运行,那就太好了。

【问题讨论】:

  • 请提供minimal reproducible example 和完整的回溯,而不仅仅是没有上下文的错误消息。
  • 感谢您的评论。我对其进行了编辑,以使其尽可能成为带有回溯的“代码”,但我仍然不确定这是否可以帮助,正如我上面解释的那样。

标签: python python-3.x typeerror python-multiprocessing


【解决方案1】:

结果

par = list(itertools.product(*par))

是浮点数(和整数)元组的列表。 Pool.map()iterable 作为第二个参数并映射其项目,将它们单独传递给给定的 func。换句话说,函数func_run(param) param 不是数字元组的列表,而是数字元组,所以

param[i][0]

正在尝试访问 ith 浮动对象的第 0 项,这当然没有意义,因此例外。您可能应该删除 func_run() 中的 for 循环:

def func_run(param):
    values = func1(param[0], param[1], param[2], param[3], r, T)
    ...

【讨论】:

    猜你喜欢
    • 2021-06-17
    • 2011-04-20
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多