pool.map: TypeError map() 从 x 到 y 位置参数,但给出了 z

pool.map: TypeError map() takes from x to y positional arguments but z were given

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

代码如下:

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 中的多处理基本示例中编写了多处理代码。

提前致谢。

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

Signature: 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)