【发布时间】:2016-07-23 19:50:29
【问题描述】:
我要优化。
简单的解决方案
connection = get_db_connection()
for item in my_iterator:
push_item_to_db(item, connection)
缺点:
get_db_connection() 很慢。如果my_iterator 为空,那么我想避免调用它。
“如果没有”解决方案
connection = None
for item in my_iterator:
if connection is None:
connection = get_db_connection()
push_item_to_db(item, connection)
缺点:
如果my_iterator 中有 100k 个项目,则 if connection is None 被调用 100k 次(尽管只需要一次)。我想避免这种情况。
完美解决方案...
- 如果迭代器为空,则不要调用
get_db_connection() - 不要在每次迭代时都调用
if connection is None:。
有什么想法吗?
【问题讨论】:
-
这是大规模的过度优化。与
push_item_to_db中发生的任何事情相比,if not i的开销微不足道。 -
如果
get_db_connection很慢,“优化”以避免if语句似乎不是正确的做法......也就是说,你的迭代器应该抛出一个StopIteration为空时终止 for each 循环。 -
@DanielRoseman 是的,这是“大规模过度优化”。但是我还是喜欢这个问题,因为我不知道如何解决它。对我来说,这比一个真正“伤害”我的问题更有趣。
-
为什么需要枚举?在您的 sn-p 中您不使用它。为什么不直接对 my_iterator 进行交互呢?在 for 循环中,仅在尚未连接时通过检查连接值进行连接
-
@joelgoldstick 是的,你是对的。我将 enumerate() 更改为“如果没有”。
标签: python loops optimization