【问题标题】:Cost of replacing an element of a list in python [duplicate]在python中替换列表元素的成本[重复]
【发布时间】:2015-06-21 12:27:04
【问题描述】:

给定python中的字符串列表,例如:

list_str = ['aa', 'bb', 'abc'].

替换列表元素的成本/复杂性如下:

list_str[i] = 'xyz'

(假设列表长度为n,字符串长度最多为m

【问题讨论】:

  • 它是O(1)。请注意,列表仅包含对对象的引用,而不是实际对象。
  • 有一个TimeTable,这可以帮助你。您可能正在寻找Set Item 行。
  • 如果有比简单赋值更好的方法,为什么 Python 不使用它本身?

标签: python list


【解决方案1】:

使用简单的测试,似乎是常数时间-

In [1]: list_str = ['aaa' for _ in range(100000)]

In [2]: %timeit list_str[0] = 'aab'
10000000 loops, best of 3: 77.7 ns per loop

In [3]: %timeit list_str[9999] = 'aab'
10000000 loops, best of 3: 77.2 ns per loop

In [4]: %timeit list_str[99999] = 'aab'
10000000 loops, best of 3: 78.7 ns per loop

In [5]: %timeit list_str[9] = 'aab'
10000000 loops, best of 3: 77.7 ns per loop

【讨论】:

    【解决方案2】:

    替换元素的成本与列表的长度无关,也与字符串的长度无关。在 Python 中,列表只包含对对象的引用。所以基本上,替换元素就是覆盖大小指针的内存部分。

    【讨论】:

      【解决方案3】:

      由于 CPython 将列表实现为数组,因此像 l[i] = x 这样的操作需要恒定 (O(1)) 时间。

      在此处查看操作表:https://wiki.python.org/moin/TimeComplexity

      【讨论】:

      • CPython 中的列表是作为数组实现的,而不是双向链表
      • 列表在 Python 中被实现为数组。
      • 啊,谢谢,会解决的。
      【解决方案4】:

      在列表中按索引替换元素的时间复杂度为 O(1)

      【讨论】:

        【解决方案5】:

        Python 中的列表被实现为动态分配的指向所包含值的指针数组。

        用另一个元素替换一个元素只是摆弄指针和调整引用计数,并且需要一个恒定的时间(与列表的大小无关)。

        【讨论】:

        • python 规范是否保证这是真的,还是它只是在 CPython 中实现的方式?
        • @EricAppelt:什么官方的python规范?
        • 好点 - 我想我要问的是 Python 语言参考中有什么暗示 list 在某种意义上需要是一个连续的数组。我没有看到任何暗示这一点的东西,但我可能错过了一些东西。
        猜你喜欢
        • 2018-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-13
        • 2021-03-03
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多