【问题标题】:How exactly does tuple slicing work in Python?元组切片在 Python 中究竟是如何工作的?
【发布时间】: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 终端用户无法改变元组,并且元组具有固定的大小,因此您可以对元组的大小做出一定的保证,从而使一切变得更简单。
  • 哦,我明白了。所以我猜在切片调用时会生成一个底层原始数组,然后更新并反映在切片元组中......?

标签: python list tuples slice


【解决方案1】:

由于元组是不可变的,因此我们不可能实例化大小为 range_end - range_start 的元组并更新值。

你不能在 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;

【讨论】:

  • 哦,哇,直到现在我才知道这个存储库的存在。每当我对如何在 python 中实现某些东西有疑问时,我一定会参考这个 repo。非常感谢!
猜你喜欢
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 2011-06-26
相关资源
最近更新 更多