我有一个很大的元素列表~100000,需要按如下方式映射它:
def mark_diff(args):
item = args[0]
pi = args[1]
item.marked_diff = (item.p/pi[0]+item.c/pi[1]+item.f/pi[2] - 3)**2
return item
def mark(f_set , goal):
with Pool(3) as p:
data = p.map(mark_diff , zip(f_set , itertools.repeat(goal)))
return data
item.markded_diff
的默认值为0
,item
为mongoengine document
。
我之所以采用多处理,是因为mark_diff
比这里显示的要复杂得多,并且涉及许多指数,即我正在使用 numpy 的对数。
现在问题来了,
返回的data
仍然具有item.marked_diff
作为0
。 如果我在底部添加一个打印语句mark_diff
则会分配正确的值并且不为零。
项的定义。
import random,mongoengine
class F(mongoengine.Document):
p = mongoengine.FloatField()
c = mongoengine.FloatField()
f = mongoengine.FloatField()
marked_diff = 0
f_sets = F.objects.all()
goal = [0.2,0.35,0.45]
所以你没有展示的东西发生了一些事情。 当我将其充实到一个完整的可执行程序中时,它似乎工作正常。 以下是在 Python 3.6.1 下运行一次的输出:
0.7024116548559156
13.468354599594324
6.036133666404753
0.16520292241977205
0.17073749475275496
1.903674418518389
0.2432159511273063
7.743326563037492
4.1990243814914425
19.36243187965931
这是完整的程序:
from multiprocessing import Pool
import random
import itertools
class F:
def __init__(self):
self.p = random.random()
self.c = random.random()
self.f = random.random()
def mark_diff(args):
item = args[0]
pi = args[1]
item.marked_diff = (item.p/pi[0]+item.c/pi[1]+item.f/pi[2] - 3)**2
return item
def mark(f_set , goal):
with Pool(3) as p:
data = p.map(mark_diff , zip(f_set , itertools.repeat(goal)))
return data
if __name__ == "__main__":
f_set = [F() for _ in range(10)]
goal = [0.2,0.35,0.45]
xs = mark(f_set, goal)
for x in xs:
print(x.marked_diff)
您是否可能在原始f_set
中查看marked_diff
,而不是在mark()
返回的项目中查看?