【问题标题】:pool.map: TypeError map() takes from x to y positional arguments but z were givenpool.map:TypeError map() 从 x 到 y 位置参数,但给定了 z
【发布时间】:2018-12-16 16:23:14
【问题描述】:

我正试图在我的程序中并行化一个函数以用于时间测量,但我得到一个错误,我不知道如何修复它。

代码如下:

def evolucionAutomata(automata, regla, numero_evoluciones):
    if(numero_evoluciones == 0):
        return 0
    with Pool(4) as p:
        automataEvolucionado = list(p.map(obtenerVecindario, automata, rotarDerecha(automata, 1), rotarIzquierda(automata, 1), lista_regla))**
    print(automataEvolucionado)
    evolucionAutomata(automataEvolucionado, regla, numero_evoluciones - 1)

def obtenerVecindario(casilla, casillaDerecha, casillaIzquierda, regla):
    if( "X" in casilla ):
        casillaBinaria = casilla.replace("X", "1")
    if( "O" in casilla):
        casillaBinaria = casilla.replace("O", "0")
    if ("X" in casillaDerecha):
        casillaBinariaDerecha = casillaDerecha.replace("X", "1")
    if ("O" in casillaDerecha):
        casillaBinariaDerecha = casillaDerecha.replace("O", "0")
    if ("X" in casillaIzquierda):
        casillaBinariaIzquierda = casillaIzquierda.replace("X", "1")
    if ("O" in casillaIzquierda):
        casillaBinariaIzquierda = casillaIzquierda.replace("O", "0")
    vecindario = []
    vecindario.append(casillaBinariaDerecha)
    vecindario.append(casillaBinaria)
    vecindario.append(casillaBinariaIzquierda)
    vecindario = list(map(int, vecindario))
    valorRetorno = evaluarVecindario(vecindario, regla)
    return valorRetorno

rotarDerecha 和 rotarIzquierda 函数,旋转自动机。

错误:

automataEvolucionado = list(p.map(obtenerVecindario, automata, rotarDerecha(automata, 1), rotarIzquierda(automata, 1), lista_regla))
TypeError: map() takes from 3 to 4 positional arguments but 6 were given

我已经从python multiprocessing documentation的python中多处理的基本示例中编写了多处理代码。

提前致谢。

【问题讨论】:

  • 我很确定 map 只接受获得一个参数的函数。尝试使用星图。
  • .. 要么将您的参数作为元组列表传递。 p.map(func, [(1,2), (3,4)])
  • 当我不使用多处理中的进程时,该函数工作得很好,由于我使用 Pool 时给出的错误,这让我感到困惑。

标签: python python-3.x parallel-processing multiprocessing python-multiprocessing


【解决方案1】:

出现错误是因为 Pool.map() 只是期望 一个 参数作为可迭代的参数,但您尝试传递更多参数。

签名:Pool.map(func, iterable, chunksize=None)

您需要将您的参数组合(压缩)成 一个 可迭代的。这个任务迭代的每一项都应该包含一个函数调用的参数。然后使用.starmap() 而不是.map() 来解包并将参数元组映射到目标函数参数。

from multiprocessing import Pool


def f(arg1, arg2):
    print(arg1, arg2)


if __name__ == '__main__':

    N = 10

    args1 = [*range(N)]
    args2 = [100] * N  # make argument iterables same length

    # create list of argument tuples for individual function calls
    tasks = [*zip(args1, args2)]
    # [(0, 100), (1, 100), (2, 100), ..., (9, 100)]

    with Pool(4) as pool:
        pool.starmap(f, iterable=tasks)

Python 2.7: How to compensate for missing pool.starmap?

【讨论】:

    猜你喜欢
    • 2020-08-18
    • 2020-05-03
    • 2018-03-15
    • 2016-09-04
    • 2018-12-13
    • 2016-11-02
    • 1970-01-01
    • 2013-02-26
    相关资源
    最近更新 更多