将不可迭代的变量传递给使用map()计算的函数

时间:2013-06-04 17:59:38

标签: python map parallel-processing ipython

我正在使用python并尝试使用此结构转换函数:

def func(g,h,iterable):
 return iterable*(g+h)

for iterable in range(20):
  print func(2,3,iterable)

进入映射函数:

def func(g,h,iterable):
 return iterable*(g+h)

print map(func,2,3,range(20)) #does not work...

我遇到的问题是通过map()函数传递常量,目前我不知道该怎么做。

我想要这个结构,所以我可以轻松使用Ipython并行工具。

假设:

  • 所有迭代的实际函数完成需要大约1.5小时(因此需要使用并行map()函数
  • 功能复杂,不能使用列表理解

基本上,如果它还不是很明显,我是一名MATLAB程序员,可以实现python的飞跃,并在matlab中寻找parfor函数的良好替代品。

4 个答案:

答案 0 :(得分:5)

首先,如果您将函数映射到range,则没有参数是可迭代的。

对于您的问题,您可以使用functools.partial

将位置参数(从左到右)绑定到函数
def func(g,h,i):
    return i*(g+h)

print map(functools.partial(func, 2,3), range(20))

# [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

对于绑定任何位置参数,请使用hkpeprah的答案中所述的lambda表达式。

答案 1 :(得分:3)

如果您提前知道参数,可以使用lambda

f = lambda lst: func(2,3,lst)
map(f, range(20))

或者,如果您不知道参数,则可以包装lambda表达式

f = lambda x: lambda y: lambda lst: func(x,y,lst)
f = f(2)
f = f(3)
map(f, range(20))

答案 2 :(得分:1)

你可以使用闭包:

def initFunction(g, h):
    def funct(value):
        return g * h * value
    return funct

myFunct = initFunction(g, h)
mapped = map(myFunct, range(20)) 

PS。我猜你正在使用python 3.x,否则xrange + generator理解会比大值的范围好得多! (等同于2.7 btw的代码):

def initFunction(g, h):
    def funct(value):
        return g * h * value
    return funct

myFunct = initFunction(g, h)
mapped = (myFunct(i) for i in xrange(20)) 

答案 3 :(得分:0)

也许不是最优雅的,但您可以使 gh 可迭代,然后将它们直接传递给 map 函数:

## the original function: 
def func(g,h,i):
    return i*(g+h)

## define some values
g1 = 2
h1 = 5
iterable1 = list(range(10))

## make g and h iterable
g1_iter = [g1] * len(iterable1)
h1_iter = [h1] * len(iterable1)

print(list(map(func, g1_iter, h1_iter, iterable1)))