我是第一次使用python,我用的是最新版本。
我有一个for循环,执行时间很长,我希望并行运行它以提高性能。
经过一番研究,我认为async.io
和async for
是最好的选择,但我还不明白如何使用这种技术转换for循环。
下面是我的代码:
def filter(my_list):
res = []
for _ in my_list:
if check(_): # this takes a while to execute
res.append(_)
else:
print(f'{_} removed')
return res
如何优化这个程序的执行时间?
程序的其余部分应该保持不变,这意味着调用filter
不应该改变,并且应该返回一个过滤后的列表。
谢谢
1条答案
按热度按时间rks48beu1#
异步
除非修改check()
1.是一个异步函数
1.使用异步库/模块
1.主要与IO结合
你将不会从async获得任何性能。一个有效的async函数的例子。
如果您有一个异步检查函数,您可以这样做
需要10秒的系列版本
与需要1秒的并行版本相比
注意在创建check_tasks列表时,我们没有使用await,这是因为asyncio.gather接受协程。
另外,如果使用time.sleep(1)而不是asyncio.sleep(1),那么串行和并行运行时都是10 s。
如果您想限制在一个时间点执行的最大异步协程数,可以使用asyncio.信号量和modify check()。
例如-如果我们想在给定的时间有两个并行的-
耗时5秒
多处理版本
检查定义为
串行运行的初始代码将是
并行版本将是
池(5)将在此处启动5个进程。请记住,启动一个进程的开销很大。