Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,array.array插入是如何工作的?_Python_Arrays - Fatal编程技术网

在python中,array.array插入是如何工作的?

在python中,array.array插入是如何工作的?,python,arrays,Python,Arrays,在python中,array.array是一种可变结构 但是,我不确定array.array结构中的插入操作是如何工作的 由于array.array使用连续内存,如果新元素不能以连续方式放置,它是否会创建新内存块并复制数组的所有元素?它是否为插入操作保留了额外的未使用空间?列出以防万一 任何在引擎盖下将数据保存在连续内存区中的体面容器,都会分配比保存当前元素数量所需的内存更多的内存插入(追加是一种特殊情况)元素时,如果没有空间容纳其他元素,会发生什么情况: 分配内存区域(当前大小+1(元素大小)

在python中,array.array是一种可变结构

但是,我不确定array.array结构中的插入操作是如何工作的

由于array.array使用连续内存,如果新元素不能以连续方式放置,它是否会创建新内存块并复制数组的所有元素?它是否为插入操作保留了额外的未使用空间?

列出以防万一

任何在引擎盖下将数据保存在连续内存区中的体面容器,都会分配比保存当前元素数量所需的内存更多的内存
插入(追加是一种特殊情况)元素时,如果没有空间容纳其他元素,会发生什么情况:

  • 分配内存区域(当前大小+1(元素大小))
  • 将数据复制到新区域
  • 自由旧区
  • 其他小操作(如大小(计数器)更新…)
  • 如图所示,当追加(这是添加元素最常见的操作)时,将有大量需要时间和资源(CPU功率、内存)的工作

    现代容器有一个不断增长的策略算法:每次需要重新分配内存区域时(容器已满),都会向现有大小中添加大量元素以计算新的大小,并且更多:N在每次重新分配时变得更大。这是为了最小化(昂贵的)内存操作
    当然,在间隔的另一端,可能会为一个容器分配大量内存(例如,500个MiB),但这是不可行的,因为大量内存将作为保留内存“存放”在那里,以防所属容器可能需要它<毕竟,这只是一个妥协的问题

    您可以以检查为例(大小和容量方法)

    回到我们的问题:
    array.array
    确实是一个现代化的容器,它可以分配未使用的空间。发件人:

    至于插入算法本身,请检查ins1功能:

    • 检查(并更新)大小,如果需要,增加内存
    • 插入位置之后的图元将向末端(“右”)移动一个位置
    • 新元素将放置在插入位置
    作为补充说明,其他Python容器使用这种技术,请查看更多详细信息

    /* This over-allocates proportional to the array size, making room
     * for additional growth.  The over-allocation is mild, but is
     * enough to give linear-time amortized behavior over a long
     * sequence of appends() in the presence of a poorly-performing
     * system realloc().
     * The growth pattern is:  0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
     * Note, the pattern starts out the same as for lists but then
     * grows at a smaller rate so that larger arrays only overallocate
     * by about 1/16th -- this is done because arrays are presumed to be more
     * memory critical.
     */