Performance of list(…).insert(…)

后端 未结 3 1572
刺人心
刺人心 2021-01-01 22:24

I thought about the following question about computer\'s architecture. Suppose I do in Python

from bisect import bisect
index = bisect(x, a)      # O(log n)          


        
相关标签:
3条回答
  • 2021-01-01 23:05

    Python is a language. Multiple implementations exist, and they may have different implementations for lists. So, without looking at the code of an actual implementation, you cannot know for sure how lists are implemented and how they behave under certain circumstances.

    My bet would be that the references to the objects in a list are stored in contiguous memory (certainly not as a linked list...). If that is indeed so, then insertion using x.insert will cause all elements behind the inserted element to be moved. This may be done efficiently by the hardware, but the complexity would still be O(n).

    For small lists the bisect operation may take more time than x.insert, even though the former is O(log n) while the latter is O(n). For long lists, however, I'd hazard a guess that x.insert is the bottleneck. In such cases you must consider using a different data structure.

    0 讨论(0)
  • 2021-01-01 23:08

    CPython lists are contiguous arrays. Which one of the O(log n) bisect and O(n) insert dominates your performance profile depends on the size of your list and also the constant factors inside the O(). Particularly, the comparison function invoked by bisect can be something expensive depending on the type of objects in the list.

    If you need to hold potentially large mutable sorted sequences then the linear array underlying Pythons list type isn't a good choice. Depending on your requirements heaps, trees or skip-lists might be appropriate.

    0 讨论(0)
  • 2021-01-01 23:26

    Use the blist module if you need a list with better insert performance.

    0 讨论(0)
提交回复
热议问题