前提:python为了提高效率会为list预先分配一定的内存空间供其使用,避免在每次append等操作都去申请内存,下面简单分析下list的内存分配算法,主要就是两段。
1、当没有元素时,newsize为0,allocated也为0,满足下面的判断条件,当前分配内存为0,list的长度也为0。
2、当插入一个元素,newsize为1,allocated为0,不满足判断,需要走下面的流程,newsize右移三位为0,小于9为3,所以new_allocated为0 + 3 = 3,再加上当前的size 1 就是4,所以在有数据时,分配的最小内存为4。
3、继续插入1个元素,又回到该段,allocated为4,大于2,newsize=allocated右移一位,所以,allocated不变,只改变list的长度,再插入仍然是这步,因为newsize为3大于allocated/2
4、插入的5话,就又走到这一步,因为newsize为5已经大于allocated右移一位了,所以,new_allocated为0 + 3 + 5等于8,所以allocated分配0,4,之后是8。
5、我们继续往后推几个内存空间,当为9时,则 1 + 6 +9 = 16;为17时,则 2 + 6 +17 = 25;为26时,则 3 + 6 + 26 = 35;之后是一样的就不推了,0,4,8,16,25,35。。。
6、当newsize减小时,算法逻辑是一样的,需要注意的是,当newsize降为0时,new_allocate也会变为0: