我知道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
以获取类似文件读取的行为。这比二分查找快得多。
bisect
是用于在列表中频繁进行搜索而不是添加项目时使用的工具。 - chepner