首页 > 解决方案 > 为什么切片比“手动”分配快得多?

问题描述

我正在研究一种数组旋转算法,在该算法中,您将数组向左d旋转旋转步骤。

我认为切片是一种高级抽象,实际上它比手动将数组中的每个值分配到旋转数组中的新位置要慢得多。

事实证明,切片的速度几乎快了 40 倍。这是为什么?

下面是对比代码:

def rot_left_manual(a, d):
    a_length = len(a)
    rot_arr = [0] * a_length
    for i in range(a_length):
        rot_arr[(i-d) % a_length] = a[i]
    return rot_arr


def rot_left_slice(a, d):
    i = d % len(a)
    b = a[i:]
    b += (a[:i])
    return b

%timeit在 Jupyter 笔记本中使用来计时功能速度

标签: pythonarraysalgorithmslice

解决方案


Python 的二进制操作相对昂贵。查看rot_arr[(i-d) % a_length] = a[i]循环的每次执行

  • 加载rot_arr, i, d,a_lengtha
  • 调用i.__sub__()并创建中间对象
  • 调用intermed.__mod__()并创建中间对象
  • 调用rot_arr.__setitem__、递减并可能释放现有的 obj

使用切片,几乎所有工作都在列表的切片方法(用 C 实现)中完成,该方法可以通过更少的计算优化大部分移动,并避免查找或创建所有这些 python 对象的费用。


推荐阅读