bisect.insort函数与list.index和insert函数之间的速度比较

时间:2018-12-12 02:07:26

标签: python insert bisection

正如Python博士所说,我认为bisect模块比列表内置方法,索引和插入要快得多,将项目插入长排序列表要快得多。因此,我只需像下面的代码那样测量两个函数bisect_func()insert_func()的时间开销。

bisect_func()得分为1.27s,insert_func()得分为1.38s,这并不是一个巨大的时差。我的问题是,在此示例中,我是否会错过某些东西来测试bisect的效率?还是bisect并不是将项目插入有序列表的唯一有效方法?

import bisect

HAYSTACK = [n for n in range(100000000)]
NEEDLES = [0, 10, 30, 400, 700, 1000, 1100, 2200, 3600, 32000, 999999]

def bisect_func():
    for needle in reversed(NEEDLES):
        bisect.insort(HAYSTACK, needle)

def insert_func():
    for needle in reversed(NEEDLES):
        position = HAYSTACK.index(needle)
        HAYSTACK.insert(position, needle)

if __name__ == '__main__':
    import time
    start = time.time()
    # bisect_func()
    insert_func()
    end = time.time()
    print(end - start)

2 个答案:

答案 0 :(得分:1)

二进制搜索只会提高查找插入索引的性能。它不会将插入改进为列表,在两种情况下均为O(N),并且支配了两个函数的渐近复杂性。请记住,插入基于数组的列表需要将所有元素移到插入索引之后。

答案 1 :(得分:1)

摘自insort的文档:

  

按排序顺序插入x。这相当于   假设a为a.insert(bisect.bisect_left(a,x,lo,hi),x)   已经排序。请记住,O(log n)搜索主要由   缓慢的O(n)插入步骤。

重要的部分是:请记住,O(log n)搜索主要由缓慢的O(n)插入步骤主导。因此,这两种方法都是 O(n)< / em>,这就是为什么它们的效率相似,而insort稍好一些的原因。