如何实现Python嵌套循环异步执行?优化余弦相似度去重效率
用asyncio实现嵌套循环任务并行执行的正确方式
你的代码之所以没有异步效果,是因为每次循环都用await直接调用异步函数,这会阻塞当前流程,必须等当前任务执行完才会启动下一个,本质还是串行执行。要实现并行,得先把所有异步任务创建好,再统一调度并发执行。
修正后的代码
import asyncio import random async def dumb_add(i,j): print("adding",i,"+",j) await asyncio.sleep(random.randint(0,3)) print(i,"+",j,"=",(i+j)) async def main(): # 先把所有要执行的异步任务收集到列表中 tasks = [] for i in range(0,2): for j in range(0,2): # 创建任务但不立即等待执行 tasks.append(asyncio.create_task(dumb_add(i,j))) # 并发运行所有收集到的任务,等待全部完成 await asyncio.gather(*tasks) print('main done') # 启动事件循环执行main任务 asyncio.run(main())
执行效果说明
修改后,所有dumb_add任务会几乎同时启动,输出顺序会因为sleep的随机时长变得无序,比如可能先打印所有adding的日志,再陆续输出计算结果,真正实现异步并行。
针对你的实际场景补充
你是用余弦相似度做两两比对(CPU密集型任务),这里要注意:asyncio更适合处理IO密集型任务(比如网络请求、文件读写),对于CPU密集型任务,Python的GIL会限制单线程的并行效率,用asyncio提升的效果有限。这种情况下更推荐用多进程(比如multiprocessing模块或concurrent.futures.ProcessPoolExecutor)来利用多核CPU,才能真正缩短O(n²)复杂度任务的耗时。
内容的提问来源于stack exchange,提问作者user13924208
相关产品推荐
相关产品推荐

