64位Python导致冻结

64位Python导致冻结,python,memory-management,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:

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文件(将此脚本用作其他内容的测试),它会冻结其他计算机吗?

该函数返回一个生成器,该生成器按照字典顺序惰性地计算给定序列的所有可能排列。然后,您的代码将所有这些排列显式存储在
列表中

你的序列包含11个字母。对于您的输入,共有11个!=39916800个排列。Python的内存效率不是特别高;对于4000万个排列中的每一个排列,需要存储以下值:

  • 指向列表对象的指针。(64位Python上有8个字节)
  • 列表容器本身,包含11个指向字符串和空闲空间的指针。(8×8字节)
因此,每个排列至少使用96个字节。添加一些填充和杂项浪费,我们可以估计每个排列使用150字节的内存。把这个乘以4000万,我们得到6G字节


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

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

函数返回一个生成器,该生成器按照字典顺序惰性地计算给定序列的所有可能排列。然后,您的代码将所有这些排列显式存储在
列表中

你的序列包含11个字母。对于您的输入,共有11个!=39916800个排列。Python的内存效率不是特别高;对于4000万个排列中的每一个排列,需要存储以下值:

  • 指向列表对象的指针。(64位Python上有8个字节)
  • 列表容器本身,包含11个指向字符串和空闲空间的指针。(8×8字节)
因此,每个排列至少使用96个字节。添加一些填充和杂项浪费,我们可以估计每个排列使用150字节的内存。把这个乘以4000万,我们得到6G字节


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


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

谢谢,你的回答很有道理。python不应该先给我一个溢出错误,而不是冻结我的计算机吗?就像上面那个家伙说的,尽管它没有回答很多问题:P无论如何,在Python 3.5上,我得到了5.78625588GB的内存使用量,使用
getsizeof(置换)+sum(getsizeof(P)表示置换中的P)
谢谢你的建议,我使用Windows 10,因此无法使用'ulimit',当我尝试导入资源时,我发现模块未找到错误-“没有名为'resource'的模块”。也许我应该阻止使用此函数生成超过一定大小的数组?谢谢,您的回答很有意义。python不应该先给我一个溢出错误,而不是冻结我的计算机吗?就像上面那个家伙说的,尽管它没有回答很多问题:P无论如何,在Python 3.5上,我得到了5.78625588GB的内存使用量,使用
getsizeof(置换)+sum(getsizeof(P)表示置换中的P)
谢谢你的建议,我使用Windows 10,因此无法使用'ulimit',当我尝试导入资源时,会出现模块未找到错误-“没有名为'resource'的模块”。也许我应该阻止使用此函数生成超过一定大小的数组?