[英]How exactly does tuple slicing work in Python?
對於列表切片,我可以想象(盡管我可能完全不了解 ...)代碼類似於實例化大小為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
誰能給我一些有關元組切片例程工作原理的見解?
編輯:我注意到我的切片起點和終點的設置是荒謬的,所以我更新了代碼片段。
因為元組是不可變的,所以我們不可能實例化一個大小為range_end-range_start的元組並更新值。
您不能處於Python級別,但是在底層C實現中完全有可能, 這就是完成的方式 。 這就是任何元組如何通過切片, tuple
構造函數, (a, b, c)
語法或其他任何方式填充其值的方式。
else if (PySlice_Check(item)) {
...
result = PyTuple_New(slicelength);
if (!result) return NULL;
src = self->ob_item;
dest = ((PyTupleObject *)result)->ob_item;
for (cur = start, i = 0; i < slicelength;
cur += step, i++) {
it = src[cur];
Py_INCREF(it);
dest[i] = it;
}
return result;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.