You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何用asyncio优化耗时for循环的执行效率?

优化耗时循环的异步方案(兼容原有调用方式)

前提说明

首先明确:asyncio仅适用于IO密集型任务(比如网络请求、文件读写等需要等待外部资源的操作)。如果你的check函数是CPU密集型(比如大量数学计算),异步不会提升性能,反而应该用多进程(multiprocessing)实现并行。下面的方案基于check是IO密集型的场景。

改造步骤

1. 将check改为异步函数

如果原来的check是同步IO操作,需要先改成异步形式(或用run_in_executor包装,见下文补充):

import asyncio

async def check(item):
    # 替换成你实际的耗时IO逻辑,比如异步网络请求、异步文件读取
    await asyncio.sleep(1)  # 模拟耗时操作
    return item % 2 == 0  # 示例:返回True表示保留,False表示移除

2. 改造原filter函数(保持调用方式不变)

在同步的filter函数内部,通过asyncio实现并发处理所有列表项,同时保留原有返回值和打印逻辑:

def filter(my_list):
    # 定义异步处理单个item的函数
    async def process_item(item):
        is_valid = await check(item)
        if not is_valid:
            print(f'{item} removed')
        return (item, is_valid)
    
    # 异步主逻辑:并发执行所有任务并收集结果
    async def main():
        # 为每个item创建异步任务
        tasks = [process_item(item) for item in my_list]
        # 并发执行所有任务,等待全部完成
        results = await asyncio.gather(*tasks)
        # 过滤出有效的item,返回和原函数一致的列表
        return [item for item, is_valid in results if is_valid]
    
    # 在同步函数中启动异步事件循环
    return asyncio.run(main())

补充:如果无法修改原check函数(同步IO)

如果你的check是同步IO函数(比如用requests发请求、同步读文件),不想修改它的话,可以用run_in_executor把同步函数包装成异步:

import time
import asyncio

# 原同步check函数
def sync_check(item):
    time.sleep(1)  # 模拟同步耗时IO
    return item % 2 == 0

# 包装成异步函数
async def check(item):
    loop = asyncio.get_event_loop()
    # 使用默认线程池执行同步函数
    return await loop.run_in_executor(None, sync_check, item)

# 原filter函数改造部分和上面一致
def filter(my_list):
    async def process_item(item):
        is_valid = await check(item)
        if not is_valid:
            print(f'{item} removed')
        return (item, is_valid)
    
    async def main():
        tasks = [process_item(item) for item in my_list]
        results = await asyncio.gather(*tasks)
        return [item for item, is_valid in results if is_valid]
    
    return asyncio.run(main())

验证调用方式

你可以像原来一样调用filter函数,完全不需要修改调用代码:

my_list = [1, 2, 3, 4, 5]
result = filter(my_list)
print(result)  # 输出: [2,4]

内容的提问来源于stack exchange,提问作者hagrid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:35:25