为啥压缩函数和可迭代的结果不起作用? [复制]
Posted
技术标签:
【中文标题】为啥压缩函数和可迭代的结果不起作用? [复制]【英文标题】:why zipping the result of a function and iterable does not work? [duplicate]为什么压缩函数和可迭代的结果不起作用? [复制] 【发布时间】:2019-01-30 03:37:47 【问题描述】:所以我有以下代码可以正常工作:
from concurrent.futures import ProcessPoolExecutor
import itertools
def grid_search_helper(vec_input):
v1 = vec_input[0]
v2 = vec_input[1]
v3 = vec_input[2]
d = 'v1' : v1, 'v2' : v2, 'v3' : v3
return(d)
idx = range(0,10)
cutoff = np.ndarray.tolist(np.arange(0.6,0.95,0.05))
opt = [2]
iters = itertools.product(idx, cutoff, opt)
with ProcessPoolExecutor(max_workers = 11) as executor:
for res in executor.map(grid_search_helper,iters):
print(res)
然后我尝试 zip() 打印 ProcessPoolExecuter 正在处理的迭代,但是当我运行以下代码时没有打印任何内容:
from concurrent.futures import ProcessPoolExecutor
import itertools
def grid_search_helper(vec_input):
v1 = vec_input[0]
v2 = vec_input[1]
v3 = vec_input[2]
d = 'v1' : v1, 'v2' : v2, 'v3' : v3
return(d)
idx = range(0,10)
cutoff = np.ndarray.tolist(np.arange(0.6,0.95,0.05))
opt = [2]
iters = itertools.product(idx, cutoff, opt)
with ProcessPoolExecutor(max_workers = 11) as executor:
for res, itr in zip(executor.map(grid_search_helper,iters), iters):
print(res, itr)
我不知道为什么。有人可以帮忙吗?
【问题讨论】:
你不能迭代iters
(即itertools.product()
)两次。要么把迭代器变成一个列表,要么在executor.map(grid_search_helper,iters)
之后重新创建迭代器。
你可以用itertools.tee
复制你的迭代器:iter_a, iter_b = tee(iters)
。
@Daniel:你能把这个写成答案让我接受吗?
【参考方案1】:
这与您压缩函数和迭代器这一事实无关。
问题是你两次使用同一个迭代器:
# v v
for res, itr in zip(executor.map(grid_search_helper, iters), iters):
...
第一次传递给map
时,它被消耗掉了。当它再次传递给zip
时,它已经是空的了,所以zip
返回一个空的生成器,并且没有什么可以迭代。
使用itertools.tee
创建同一个迭代器的两个副本。
it1, it2 = itertools.tee(itertools.product(idx, cutoff, opt))
with ProcessPoolExecutor(max_workers = 11) as executor:
for res, itr in zip(executor.map(grid_search_helper,it1), it2):
print(res, itr)
【讨论】:
【参考方案2】:当它尝试执行zip(..., iters)
时,之前填充的iters
已经为空,因为executor.map(grid_search_helper, iters)
已经消耗了它的所有项目。
所以你实际上是在将一个空迭代器传递给zip()
。
【讨论】:
以上是关于为啥压缩函数和可迭代的结果不起作用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章