只看楼主 #交流探讨#切片还是索引
-
切片不会出现报错的情况,而索引获取值的话,超出范围就会报错。
我们还发现切片也可以获取跟索引一样单个的值。
那么问题来了,他们之间除了写法不一样,计算机内部真正实现起来的时候机理是一样的吗?
时间复杂度和空间复杂度又是如何?
我测试了一个时间:
上面这张图片测试了一下切片:试了很多次基本上是超过1秒的。
上面这张图片测试了一下索引:试了很多次基本上是不到1秒的。
也就是说如果索引是在合理范围之内的话,感觉通过索引来获取值在时间上还是更优于切片的,这个是我测试的方式,也不确定这样测试是否合理。
老师们也可以去找一下相关的资料,把自己的想法说出来。
阅读:859 回复:2 2022-03-21 08:33:19
-
1. 数组索引的本质:我们都知道,数组是连续存储的空间单位,但其实它指的是在虚拟内存中的连续存储。事实上,我们用数组下标访问一个数据的时候,它会在编译过程中经历两张向量表的映射,本质上就是对应到虚拟内存,再指向物理内存,随后读取数据。大致可以表示成这样的图:
所以说,当使用索引获取值时,它是直接映射到信息向量表的内存地址的,当这个地址不存在时,就会返回错误。
2. 而切片呢,我查阅了相关资料,没有找到python实现切片的底层代码。但是从切片提供的接口(begin, end, step)可以看出,它本质应该是一个迭代器。从这个角度,我找到了一个博主写的模拟切片的迭代方法:
所以说,切片在映射到内存之前,会先经历一个判断的异常捕获,如果抛出异常了,那么能够返回一个空值,从而避免了溢出错误。
这样,其实就很好理解为什么切片获取会比索引获取耗费更多的时间了。因为切片比索引多了两个程序步,导致执行时间变长。
参考资料:
2022-03-21 16:39:20