python - 为什么切片比“手动”分配快得多?
问题描述
我正在研究一种数组旋转算法,在该算法中,您将数组向左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 笔记本中使用来计时功能速度
解决方案
Python 的二进制操作相对昂贵。查看rot_arr[(i-d) % a_length] = a[i]
循环的每次执行
- 加载
rot_arr
,i
,d
,a_length
和a
- 调用
i.__sub__()
并创建中间对象 - 调用
intermed.__mod__()
并创建中间对象 - 调用
rot_arr.__setitem__
、递减并可能释放现有的 obj
使用切片,几乎所有工作都在列表的切片方法(用 C 实现)中完成,该方法可以通过更少的计算优化大部分移动,并避免查找或创建所有这些 python 对象的费用。
推荐阅读
- c# - C# 泛型和子类化 - 为什么我不能在 ctor 上给出类型参数?(简单的)
- git - Xamarin 在源代码控制下找不到目录并且路径中有非法字符
- amazon-web-services - 使用 aws cli 创建 cognito-user-pool 时出错 - `角色无权使用 SNS 发布`
- javascript - React 中的过滤
- html - HTML5中如何改变input type='datetime-local'的显示格式?
- python - 按特定顺序移动 pandas 数据框中的行
- google-analytics - 在哪里可以找到谷歌分析中设置的过滤器的 filterId?
- android - Android Studio AlertDialog 边缘
- python - 如何抓取使用 BankID 使用 Python 登录的网站(BeautifulSoap,Requests)?
- sql - 如何在 jpa 中为 EmbeddedId 编写选择命名查询?