Python:结合itertools和sets来节省内存

时间:2012-11-13 10:20:52

标签: python memory-management set itertools

所以我几天前在Python中发现了套装,并且很惊讶他们之前从未想过,即使他们让很多事情变得非常简单。我稍后再举一个例子。

有些事情我还不清楚。文档说可以从迭代创建集合,并且运算符总是返回新集合,但它们是否始终将所有数据从一个集合复制到另一个集合并从迭代中复制?我使用大量数据,并希望设置和设置与itertools非常相似的运算符。因此,集合([iterable])将更像一个包装器,运算符union,intersection等将返回“iSets”并且不会复制任何数据。他们都会评估我的最后一集。最后我真的很想拥有“iSet”运营商。

目的: 我使用mongoengine与MongoDB一起工作。我保存了文章。一些与用户相关联,一些被标记为读取其他人向用户显示,等等。将它们包装在不加载所有数据的集合中将是组合,交叉等的好方法。显然我可以进行特殊查询,但并不总是因为MongoDB不支持连接。所以我最终在Python中加入了联接。我知道我可以使用关系数据库,但是,我不需要经常加入,在我的情况下MongoDB的优势超过了它们。

那么你怎么看?是否已有第三方模块?结合itertools和Sets的几行会吗?

修改 我接受了Martijn Pieters的回答,因为它显然是正确的。我最终只将ID加载到集合中以便与它们一起使用。此外,Python中的集合具有相当好的运行时间。

1 个答案:

答案 0 :(得分:4)

集合就像dictlist;在创建时,他们从种子迭代中复制引用。

迭代器无法成为集合,因为您无法强制执行集合的唯一性要求。您无法知道迭代器产生的未来值是否已经被看到过。

此外,为了确定两个迭代之间的交集,你从这些迭代中的至少一个加载所有数据以查看是否有任何匹配。对于第二个iterable中的每个项目,您需要测试是否在第一个iterable中看到了该项目。要有效地执行此操作,您需要将第一个可迭代项中的所有项加载到集中。另一种方法是从第二个可迭代循环遍历从开始到结束的每个项的第一个可迭代,导致指数性能下降。