import bisect
from time import perf_counter
from decimal import Decimal
ordered_list = [i for i in range(0, 10000000, 2)] # 定义一个0-9999999的升序偶数列表
insert_value = 9966666 # 需要插入的值
def loop_traversal_search():
"""用传统循环遍历方式进行搜索"""
start_time = perf_counter() # 开始时间
for i, value in enumerate(ordered_list):
if insert_value <= value:
print(‘插入元素{}的索引值应为: {}‘.format(insert_value, i))
break
end_time = perf_counter() # 结束时间
duration_time = end_time - start_time # 搜索时间计算
print("循环遍历方式搜索耗时: {}秒".format(Decimal(str(duration_time))))
def bisect_search():
"""用bisect搜索"""
start_time = perf_counter() # 开始时间
position = bisect.bisect_left(ordered_list, insert_value)
print(‘插入元素{}的索引值应为: {}‘.format(insert_value, position))
end_time = perf_counter() # 结束时间
duration_time = end_time - start_time # 搜索时间计算
print("bisect搜索耗时: {}秒".format(Decimal(str(duration_time))))
if __name__ == ‘__main__‘:
loop_traversal_search()
print(‘---------------------------------------------------‘)
bisect_search()
插入元素9966666的索引值应为: 4983333
循环遍历方式搜索耗时: 0.3305077秒
---------------------------------------------------
插入元素9966666的索引值应为: 4983333
bisect搜索耗时: 0.000009599999999998499秒
import bisect
from time import perf_counter
from decimal import Decimal
def bisect_search_and_insert(ordered_list, insert_value):
"""用bisect搜索并且insert插入"""
start_time = perf_counter() # 开始时间
position = bisect.bisect(ordered_list, insert_value)
ordered_list.insert(position, insert_value)
end_time = perf_counter() # 结束时间
duration_time = end_time - start_time # 搜索并插入时间计算
print("bisect搜索并插入耗时: {}秒".format(Decimal(str(duration_time))))
def bisect_insort_value(ordered_list, insert_value):
""""用insort插入"""
start_time = perf_counter()
bisect.insort(ordered_list, insert_value)
end_time = perf_counter()
duration_time = end_time - start_time # 搜索并插入时间计算
print("insort插入耗时: {}秒".format(Decimal(str(duration_time))))
if __name__ == ‘__main__‘:
bisect_search_and_insert([i for i in range(0, 10000000, 2)], 9696969)
print(‘----------------------------------------------------------‘)
bisect_insort_value([i for i in range(0, 10000000, 2)], 9696969)
bisect搜索并插入耗时: 0.0002004秒
----------------------------------------------------------
insort插入耗时: 0.000128000000000017秒
经过测试:用insort插入元素并且保持列表有序的速度更快一些
其他应用延伸:bisect还可以用来在有序序列中快速搜索某个元素的所在位置索引
原文:https://www.cnblogs.com/iamgk/p/14402374.html