【发布时间】:2013-04-16 19:48:12
【问题描述】:
我基本上是在寻找可能对此有意见的其他人的一些反馈。以下不是我正在处理的内容,但示例代码确实重现了该问题。
如果我发送的基本列表传入,我有一个幂集生成器,它返回所有排列。我需要对生成的集合进行排序(在我的实际情况下,返回的集合是具有我想要排序的值的元组通过,下面的示例演示了没有它的问题)
问题是当我在电源组生成器上使用 sorted() 时,它会增加内存使用量。我意识到 2^50 是一个非常大的数字,但是没有排序的内存使用量是相当平坦的,所以我想知道是否有更好的方法可以在一两分钟内对大量集合进行排序而不会耗尽内存。这是在带有 Python 2.6.5 的 Ubuntu 上运行的。 (在这种情况下也需要)
def gen_powerset(seq):
if len(seq) <= 1:
yield seq
yield []
else:
for i in gen_powerset(seq[1:]):
yield [seq[0]]+i
yield i
def main():
initialSet = range(50)
powerset = sorted(gen_powerset(initialSet))
for i in powerset:
print i
if __name__ == "__main__":
main()
免责声明:如果您尝试运行此示例,请注意您的内存使用情况。如果样本接近 90%,请按 Ctrl-C,因为您的操作系统将开始将内存交换到磁盘。如果示例仍在运行,您的磁盘负载会飙升并真正减慢速度,因此很难从一开始就杀死示例。
【问题讨论】:
-
你正在阻塞你的进程。你这样做有什么特别的目标吗?
-
在示例中,range(50) 将生成 50 个项目的 2^50 个组合。那是 1.1258999e+15 排列,太大而无法合理地放入内存中。我期待更大的套装。请注意,该范围仅适用于此示例,这是从包含我需要的数据的文件中加载的数据集。生成的集合是循环的,所以我可以找到有价值的项目并处理它们。如果已排序,则价值最高的项目应位于列表顶部。我知道 sorted 调用生成器是一个关键点,基本上会导致 sorted() 一次加载整个数据集。
-
也许应该使用数据库来存储生成的列表以进行排序?
标签: python performance sorting memory tuples