三国纷争
在堆上分配的内存可能会受到高水标记的影响.Python为分配小对象而进行的内部优化(PyObject_Malloc)在4个Kib池中,按8字节的倍数对分配大小进行了分类-最多256个字节(在3.3中为512字节)。池本身在256个Kib竞技场中,所以如果只使用一个池中的一个块,整个256 Kib竞技场就不会被释放。在Python3.3中,小对象分配器被转换为使用匿名内存映射而不是堆,因此它在释放内存方面应该表现得更好。此外,内置类型维护以前分配的对象的自由职业者,这些对象可以使用小对象分配器,也可以不使用。这个int类型使用自己分配的内存维护自由职业者,清除它需要调用PyInt_ClearFreeList()..这可以通过执行完整的操作间接调用。gc.collect.像这样试试,告诉我你得到了什么。这是链接psutil.Process.Memory_info.import osimport gcimport psutil
proc = psutil.Process(os.getpid())gc.collect()mem0 = proc.get_memory_info().rss# create approx. 10**7 int objects and pointersfoo =
['abc' for x in range(10**7)]mem1 = proc.get_memory_info().rss# unreference, including x == 9999999del foo, x
mem2 = proc.get_memory_info().rss# collect() calls PyInt_ClearFreeList()# or use ctypes: pythonapi.PyInt_ClearFreeList()gc.collect()mem3 =
proc.get_memory_info().rss
pd = lambda x2, x1: 100.0 * (x2 - x1) / mem0print "Allocation: %0.2f%%" % pd(mem1, mem0)print "Unreference: %0.2f%%" % pd(mem2, mem1)print
"Collect: %0.2f%%" % pd(mem3, mem2)print "Overall: %0.2f%%" % pd(mem3, mem0)产出:Allocation: 3034.36%Unreference: -752.39%Collect: -2279.74%Overall: 2.23%编辑:我切换到相对于进程VM大小的测量,以消除系统中其他进程的影响。当顶部连续的空闲空间达到常数、动态或可配置的阈值时,C运行时(例如glibc、msvcrt)会收缩堆。使用glibc,您可以使用mallopt(M_TRIM_阈值)。考虑到这一点,如果堆的收缩幅度更大(甚至更大),也就不足为奇了。free.在3.xrange不会创建列表,所以上面的测试不会创建1000万int物品。即使是这样,int输入3.x基本上是2.xlong并不能实现一个自由职业者。