【发布时间】:2016-07-26 18:29:20
【问题描述】:
我知道 bisect 使用二进制搜索来保持列表的排序。但是我做了一个计时测试,这些值正在被读取和排序。但是,与我的知识相反,保留这些值然后对它们进行排序会以高差异赢得时机。有经验的用户能否解释一下这种行为?这是我用来测试时间的代码。
import timeit
setup = """
import random
import bisect
a = range(100000)
random.shuffle(a)
"""
p1 = """
b = []
for i in a:
b.append(i)
b.sort()
"""
p2 = """
b = []
for i in a:
bisect.insort(b, i)
"""
print timeit.timeit(p1, setup=setup, number = 1)
print timeit.timeit(p2, setup=setup, number = 1)
# 0.0593081859178
# 1.69218442959
# Huge difference ! 35x faster.
在第一个过程中,我一个接一个地取值,而不是仅仅对a 进行排序以获得文件读取等行为。而且它非常难于平分。
【问题讨论】:
-
因为 timsort 是一种高效的排序算法,而列表插入很慢?
-
这可能是原因,但是 bisect 的优势是什么?
-
什么意思?如果您已经有一个排序列表,并且想要保持排序,那是最好的方法。许多其他操作在排序列表上效率更高。
-
bisect适用于您搜索列表的频率远高于向列表添加项目的频率。 -
那是插入排序。
标签: python algorithm performance sorting