元组切片在Python中是如何工作的?

2024-04-25 05:07:19 发布

您现在位置: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

结果是:

^{pr2}$

有谁能告诉我元组切片程序是如何工作的吗?在

编辑:我注意到我对切片的起点和终点的设置很荒谬,所以我更新了代码片段。在


Tags: 代码列表time切片slicerangestartmax
1条回答
网友
1楼 · 发布于 2024-04-25 05:07:19

It's not like we could potentially instantiate a tuple of size range_end - range_start and update the values since tuples are immutable.

不能在Python级别,但在底层C实现和that's how it's done中是完全可能的。这就是任何元组如何填充其值,无论是通过切片、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;

相关问题 更多 >