将yield用作表达式实现数据库内快速过滤的思路是否可行?
关于协程实现查询过滤的思路分析
你的这个思路是可行的,但得结合具体场景来看是否适合:
合理的适用场景
如果你的查询结果是静态不更新的,而且需要基于同一份结果做多次过滤操作,这个方式确实能帮你避免重复执行昂贵的查询(比如数据库查询、大文件读取)——只需要在协程初始化时获取一次数据,后续每次发送过滤条件,都直接在内存里处理,能节省重复查询的开销。就像你示例里的固定列表,每次发送不同名字就能快速得到过滤结果,完全没问题。
需要注意的问题
内存压力
如果查询结果是大数据量(比如pandas的超大DataFrame),这份数据会一直存在协程的内存空间里,要是长期运行或者创建多个协程实例,内存占用会很高,反而得不偿失。数据时效性
如果源数据(比如数据库)会频繁更新,协程里缓存的旧数据不会自动同步,除非你重新初始化协程。这种场景下,反而不如每次过滤前重新查询一次,保证数据是最新的。协程的必要性
其实单纯做多次过滤,不用协程也能轻松实现:把查询结果存成一个变量,写个普通函数接收过滤条件返回结果就行。协程在这里的核心是“阻塞等待输入”,但如果你的过滤是主动触发的(比如用户输入条件后调用方法),普通函数反而更直观,没必要为了用协程而增加代码复杂度。
示例代码的小优化
你的示例里变量名重复了,可读性不太好,建议调整一下:
def create_corroutine(func): def wrapper(*args, **kwargs): coro = func(*args, **kwargs) next(coro) return coro return wrapper @create_corroutine def corroutine(): query = ['Giannis', 'Lebron', 'Ja Morant'] while True: search_name = yield # 变量名区分开,避免混淆 result = [person for person in query if person == search_name] print(result) c = corroutine() c.send('Lebron')
内容的提问来源于stack exchange,提问作者Lucas Emanuel
相关产品推荐
相关产品推荐

