簡體   English   中英

元組切片在Python中到底如何工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM