【发布时间】:2018-03-22 09:55:13
【问题描述】:
对于列表切片,我可以想象(尽管我可能完全不知道...)代码类似于实例化大小列表 range_end - range_start 并从原始列表输入值到新创建的数组中。
元组切片究竟是如何工作的?我们不可能实例化一个大小为 range_end - range_start 的元组并更新值,因为元组是不可变的。
我已经尝试了几个测试,似乎元组切片和列表切片的平均性能相似:
import time
_max = 10000000
_list = range(_max)
_tuple = tuple(_list)
mid = _max // 2
i = 10000
while i <= _max:
print 'for', i, ' elements :'
s = mid - half
e = mid + half - 1
# list slice
start = time.clock()
lSlice = _list[s:e]
end = time.clock()
print 'list slice took:', end - start
# tuple slice
start = time.clock()
tSlice = _tuple[s:e]
end = time.clock()
print 'tuple slice took:', end - start
i *= 10
结果:
for 10000 elements :
list slice took: 6.78296778938e-05
tuple slice took: 2.94523601381e-05
for 100000 elements :
list slice took: 0.000377971955106
tuple slice took: 0.000270872463694
for 1000000 elements :
list slice took: 0.00472353381912
tuple slice took: 0.00548037022509
for 10000000 elements :
list slice took: 0.0499159492116
tuple slice took: 0.0504157468382
谁能给我一些关于元组切片例程如何工作的见解?
编辑:我注意到我对切片起点和终点的设置很荒谬,所以我更新了代码 sn-p。
【问题讨论】:
-
“不可变”只是意味着对象不公开任何可以改变它的方法,但是您可能可以破解一些方法来改变它,并且实现肯定可以改变底层的原始数组。
-
由于 C 代码可以确保 Python 终端用户无法改变元组,并且元组具有固定的大小,因此您可以对元组的大小做出一定的保证,从而使一切变得更简单。
-
哦,我明白了。所以我猜在切片调用时会生成一个底层原始数组,然后更新并反映在切片元组中......?