pool.map: TypeError map () принимает позиционные аргументы от x до y, но были заданы z - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь распараллелить функцию в моей программе для измерения времени, но получаю ошибку и не знаю, как ее исправить.

Вот код:

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 из многопроцессорная документация python .

Заранее спасибо.

1 Ответ

0 голосов
/ 16 декабря 2018

Ошибка возникает из-за того, что 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...