我有一个单元列表,我在所有这些单元上调用REST API来返回有关它们的更多数据.我正在使用map()来执行此 *** 作,但是当我尝试将该映射转换为列表时,程序会挂起并且不会继续(当我运行它并调试它时)
data = List(map(lambda product: clIEnt.request(units_url + "/" + product),units))
起初我想也许这是一个很快调用API的问题,但是当我遍历地图(没有将其转换为列表)手动并打印它时就可以了:
data = map(lambda product: clIEnt.request(units_url + "/" + product),units)for item in data: print(item) # <-- this works just fine for the entire map
任何人都知道我为什么会这样做?
解决方法 当您列出地图时,这表示每个请求都是串行调度,等待完成,然后存储到结果列表中.如果您要分派1000个请求,这意味着每个请求必须按顺序一个一个地完成,然后才能构建列表并看到第一个结果;它是完全同步的.您可以在直接映射迭代情况下立即获得结果(几乎),因为它一次只能生成一个请求;而不是等待1000个请求,它等待1,你处理该结果,然后等待另一个,等等.
如果目标是最小化延迟,请查看multiprocessing.Pool.imap
(或者在multiprocessing.dummy中实现的池的基于线程的版本;线程可以是并行网络I / O请求的理想选择,并且不需要IPC的pickling数据).使用Pool的map,imap或imap_unordered方法(根据您的需要选择一个),将一次一个地调度请求(取决于您选择的工作者数量).如果你绝对必须有一个列表,Pool.map通常会更快地构建它;如果你可以直接迭代并且不关心结果的排序,那么Pool.imap_unordered将以工人可以获得的结果尽可能快地获得结果,无论他们满意的是什么.没有Pool的普通地图没有得到你任何神奇的性能优势(列表理解通常会更快地运行),所以使用池.
简单示例代码以获得最快的结果
import multiprocessing.dummy as multiprocessing # import thread based version of library; for network I/O should work finewith multiprocessing.Pool(8) as pool: # Pool of eight worker threads for item in pool.imap_unordered(lambda product: clIEnt.request(units_url + "/" + product),units): print(item)
如果你真的需要,你可以使用Pool.map并存储到一个真实的列表,并假设你有带宽来运行八个并行请求(或者你配置池的工作人员多少),这应该(大致)划分时间八点完成地图.
总结以上是内存溢出为你收集整理的python将地图转换为列表需要很长时间全部内容,希望文章能够帮你解决python将地图转换为列表需要很长时间所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)