正如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)
答案 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
稍好一些的原因。