pool.map:TypeError map()从x到y接受位置参数,但给定z [英] pool.map: TypeError map() takes from x to y positional arguments but z were given

查看:139
本文介绍了pool.map:TypeError map()从x到y接受位置参数,但给定z的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

出于时间测量的目的,我正在尝试在程序中并行化一个函数,但是出现错误,并且我不知道如何解决该问题.

I'm trying to parallelize a function in my program for time measurement purposes, but I get an error and I don't know how to fix it.

代码如下:

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函数旋转自动机.

rotarDerecha and rotarIzquierda functions, rotates the automaton.

错误:

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

我从谢谢.

推荐答案

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

The error comes because Pool.map() is just expecting one argument for the argument-iterable, but you try to pass more.

签名:Pool.map(func,可迭代,chunksize = None)

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

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

You need to combine (zip) your arguments into one iterable. Every item of this task-iterable should contain the arguments for one function call. Then you use .starmap() instead of .map() to let it unpack and map the argument-tuples to the target-function parameters.

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:如何补偿丢失的pool.starmap?

这篇关于pool.map:TypeError map()从x到y接受位置参数,但给定z的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆