在重构一段代码时,我注意到了这一点:
if product_id in [c["id"] for c in self.data.load_products()]:
# Do something
反过来,load_products()
执行 SQL 查询,并且对于每个产品:
- 执行一些相对 CPU 开销较大的操作,并且:
- 用于
yield
将产品一一返回给调用者。
据我了解,列表推导和生成器表达式之间的区别在于,在列表推导的情况下,所有产品都将从数据库加载并进行处理,即使第一个产品是匹配的。
因此,如果我用这样的生成器表达式替换它:
# ↴ ↴
if product_id in (c["id"] for c in self.data.load_products()):
# Do something
它可以通过最终减少代码的工作来改进代码,即一旦找到匹配项,就不会从数据库加载下一个产品,也不会进行处理。
不过,可以肯定的是,我不太了解 Python。
我对吗?Python 会在找到匹配项后立即停止,还是两段代码都执行相同的操作并从数据库中加载每个产品?