python将地图转换为列表需要很长时间

python将地图转换为列表需要很长时间,第1张

概述编辑:我使用的是 Python 3.5.0,因此与Python 2.x不同,map()将返回迭代器而不是列表 我有一个单元列表,我在所有这些单元上调用REST api来返回有关它们的更多数据.我正在使用map()来执行此 *** 作,但是当我尝试将该映射转换为列表时,程序会挂起并且不会继续(当我运行它并调试它时) data = list(map(lambda product: client.request 编辑:我使用的是 Python 3.5.0,因此与Python 2.x不同,map()将返回迭代器而不是列表

我有一个单元列表,我在所有这些单元上调用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将地图转换为列表需要很长时间所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1197409.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存