以下示例的复杂性是什么:

tuple_ = (1,2,..,3,1) # tuple of length n
(*tuple_[:k], *tuple_[k+1:]) # deleting element at index k

正常情况下,tuple_[:k]tuple_[k+1:]的切片分别为O(k)O(n-k). 但是,切片是否首先发生,然后元素被一个接一个地添加到结果元组中,这意味着另有n个操作? 我知道复杂度是O(2n)是O(N),但我想知道这里的运算次数是不是因为星号而加倍?

推荐答案

假设我们有一个输入:

tuple_ = tuple(range(1000))
k = 400

让我们分析两个表达式:(tuple_[:k], tuple_[k+1:])(*tuple_[:k], *tuple_[k+1:]),使用dis模块来发现和比较执行了哪些重要操作under the hood.

100:

import dis

...
dis.dis("(tuple_[:k], tuple_[k+1:])")

 1           0 LOAD_NAME                0 (tuple_)
              2 LOAD_CONST               0 (None)
              4 LOAD_NAME                1 (k)
              6 BUILD_SLICE              2
              8 BINARY_SUBSCR
             10 LOAD_NAME                0 (tuple_)
             12 LOAD_NAME                1 (k)
             14 LOAD_CONST               1 (1)
             16 BINARY_ADD
             18 LOAD_CONST               0 (None)
             20 BUILD_SLICE              2
             22 BINARY_SUBSCR
             24 BUILD_TUPLE              2
             26 RETURN_VALUE

这里的重要运算是BUILD_SLICE 1、BUILD_SLICE 2和BUILD_TUPLE,它们将表达式的运行时间合计为103 + 104 + 105(因为最终的元组BUILD_TUPLE仅包含2个片/元组).


100:

dis.dis("(*tuple_[:k], *tuple_[k+1:])")


  1           0 BUILD_LIST               0
              2 LOAD_NAME                0 (tuple_)
              4 LOAD_CONST               0 (None)
              6 LOAD_NAME                1 (k)
              8 BUILD_SLICE              2
             10 BINARY_SUBSCR
             12 LIST_EXTEND              1
             14 LOAD_NAME                0 (tuple_)
             16 LOAD_NAME                1 (k)
             18 LOAD_CONST               1 (1)
             20 BINARY_ADD
             22 LOAD_CONST               0 (None)
             24 BUILD_SLICE              2
             26 BINARY_SUBSCR
             28 LIST_EXTEND              1
             30 LIST_TO_TUPLE
             32 RETURN_VALUE

在这里,Python从BUILD_LIST开始构建了一个空列表.这有几个原因:1)解包需要flattening个序列;2)并不是所有参数都需要解包,因此可以在最终容器上的不同点上安排展平.知道tuple是不可变的,list被用作内部存储.

这里的重要运算是BUILD_SLICE 1、LIST_EXTEND 1、BUILD_SLICE 2、LIST_EXTEND 2和LIST_TO_TUPLE.它们将表达式的运行时间合计为105 + 106 + 107

这种复杂性似乎相当具有代表性.

Python-3.x相关问答推荐

"安装serial vs安装psyserial header,"""

在Python中从列创建新行

GUI 仍然有效并且没有错误消息时图形意外冻结 |具有多线程的 Pyside6 和 pyqtgraph (Python 3.11.4)

命名空间前缀无效

Python中根据分组/ID对两个数据框进行映射,以更接近值的升序排列

公开数据中的卫星图像网页抓取优化

找到在指定列的另一个分组中存在重复的行.

python3,将整数转换为字节:对于小整数使用 to_bytes() 有哪些替代方法?

根据按不同列中的值分组的平均值划分 DataFrame

如何统计一个值连续出现的次数?

以不规则频率识别数据框日期时间列上缺失的日期,并用关联值填充它们

Pandas:从 Pandas 数据框中的 1 和 0 模式中获取值和 ID 的计数

使用 selenium 加速网页抓取

Python pandas将单元格值移动到同一行中的另一个单元格

总结基于条件的值,如果不匹配则保留当前值

如何在 Spyder 控制台中使用变量执行 Python 3.3 脚本?

Pandas 的 EMA 与股票的 EMA 不匹配?

AttributeError:LinearRegression 对象没有属性coef_

Python在OrderedDict中 Select 第i个元素

如何为 Python 3.x 安装 psycopg2?