64位Python导致冻结

时间:2017-01-28 06:17:55

标签: python memory-management

作为编程的新手,我正在使用这个脚本来玩Python:

import itertools
Lists=list(itertools.permutations(['a','b','c','d','e','f','g','h','i','j','k']))
print(len(Lists))

在32位Python上,它将导致内存溢出错误。然而,当在64位Python上尝试并观察任务管理器时,Python使用4 GB的内存(我有8 GB的RAM)然后我的计算机冻结,我必须重新启动它。

这是正常行为吗?我该如何解决这个问题,或者限制Python有多少内存访问?

此外,如果我将这样的内容转换为.exe文件(使用此脚本测试其他内容)会冻结其他计算机吗?

1 个答案:

答案 0 :(得分:2)

函数itertools.permutations()返回一个生成器,它以字典顺序懒惰地计算给定序列的所有可能的排列。然后,您的代码会在list

中明确存储所有这些排列

您的序列包含11个字母。对于您的输入,有11个! = 39 916 800个排列。 Python的内存效率并不高;对于4000万个排列中的每一个,需要存储这些值:

  • 指向列表对象的指针。 (64位Python上的8个字节)
  • 列表容器本身,包含11个指向字符串和松弛空间的指针。 (8×8字节)

因此每个排列使用至少96个字节。添加一些填充和杂项浪费,我们可以估计每个排列使用150个字节的内存。将此乘以4000万,我们得到6千兆字节。

这种高内存使用率解释了为什么你的程序在32位Python上死亡(不能使用超过4 GB的RAM,并且在实践中限制为2 GB)。此外,当进程占用大量内存时,如果启用了页面/交换文件,它可能会导致抖动。

限制Python内存限制的一种方法是通过操作系统提供的机制,例如ulimit。另一种方法是咨询resource module