Python中列表(list)的实现其实是一个数组,当要查找某一个元素的时候时间复杂度是O(n),使用list.index()方法,但是随着数据量的上升,list.index()的性能也逐步下降,所以我们需要使用bisect模块来进行二分查找,前提我们的列表是一个有序的列表。

递归二分查找和循环二分查找

def binary_search_recursion(lst, val, start, end):

if start > end:

return None

mid = (start + end) // 2

if lst[mid] < val:

return binary_search_recursion(lst, val, mid + 1, end)

if lst[mid] > val:

return binary_search_recursion(lst, val, start, mid - 1)

return mid

def binary_search_loop(lst, val):

start, end = 0, len(lst) - 1

while start <= end:

mid = (start + end) // 2

if lst[mid] < val:

start = mid + 1

elif lst[mid] > val:

end = mid - 1

else:

return mid

return None

为了比对一下两者的性能,我们使用timeit模块来测试两个方法执行,timeit模块的timeit方法默认会对需要测试的函数执行1000000,然后返回执行的时间。

>>> import random

>>> from random import randint

>>> from random import choice

>>> random.seed(5)

>>> lst = [randint(1, 100) for _ in range(500000)]

>>> lst.sort()

>>> val = choice(lst)

>>> val

6

>>> def test_recursion():

... return binary_search_recursion(lst, val, 0, len(lst) - 1)

...

>>> def test_loop():

... return binary_search_loop(lst, val)

...

>>> import timeit

>>> t1 = timeit.timeit("test_recursion()", setup="from __main__ import test_recursion")

>>> t1

3.9838006450511045

>>> t2 = timeit.timeit("test_loop()", setup="from __main__ import test_loop")

>>> t2

2.749765167240339

可以看到,循环二分查找比递归二分查找性能要来的好些。现在,我们先用bisect的二分查找测试一下性能

用bisect来搜索

>>> import bisect

>>> def binary_search_bisect(lst, val):

... i = bisect.bisect(lst, val)

... if i != len(lst) and lst[i] == val:

... return i

... return None

...

>>> def test_bisect():

... return binary_search_bisect(lst, val)

...

>>> t3 = timeit.timeit("test_bisect()", setup="from __main__ import test_bisect")

>>> t3

1.3453236258177412

对比之前,我们可以看到用bisect模块的二分查找的性能比循环二分查找快一倍。再来对比一下,如果用Python原生的list.index()的性能

>>> def test_index():

... return lst.index(val)

...

>>> t4 = timeit.timeit("test_index()", setup="from __main__ import test_index")

>>> t4

518.1656223725007

可以看到,如果用Python原生的list.index()执行1000000,需要500秒,相比之前的二分查找,性能简直慢到恐怖

用bisect.insort插入新元素

排序很耗时,因此在得到一个有序序列之后,我们最好能够保持它的有序。bisect.insort就是为这个而存在的

insort(seq, item)把变量item插入到序列seq中,并能保持seq的升序顺序

import random

from random import randint

import bisect

lst = []

SIZE = 10

random.seed(5)

for _ in range(SIZE):

item = randint(1, SIZE)

bisect.insort(lst, item)

print('%2d ->' % item, lst)

输出:

10 -> [10]

5 -> [5, 10]

6 -> [5, 6, 10]

9 -> [5, 6, 9, 10]

1 -> [1, 5, 6, 9, 10]

8 -> [1, 5, 6, 8, 9, 10]

4 -> [1, 4, 5, 6, 8, 9, 10]

1 -> [1, 1, 4, 5, 6, 8, 9, 10]

3 -> [1, 1, 3, 4, 5, 6, 8, 9, 10]

2 -> [1, 1, 2, 3, 4, 5, 6, 8, 9, 10]

python使用方法-Python中bisect的使用方法相关推荐

  1. 计算机中信息表示方法,计算机中的信息表示方法二进制

    计算机中的信息表示方法二进制Tag内容描述: 1.,计算机中的信息表示方法 二进制,抚顺县石文学校信息技术教研组 袁丽丽,学 习 目 标,1.了解二进制与十进制的对应关系: 2.学会二进制与十进制的换 ...

  2. python中列表的sort方法_python中列表的sort方法使用详解

    内容简介:python中列表的sort方法使用详解 一.基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的. 排序,数字.字符 ...

  3. python添加自定义模块_Python中添加自定义模块的方法

    Python中添加自定义模块的方法 发布时间:2020-07-17 14:01:03 来源:亿速云 阅读:95 作者:小猪 这篇文章主要讲解了Python中添加自定义模块的方法,内容清晰明了,对此有兴 ...

  4. python list排序方法_python中List的sort方法指南

    简单记一下python中List的sort方法(或者sorted内建函数)的用法. List的元素可以是各种东西,字符串,字典,自己定义的类等. sorted函数用法如下: sorted(data, ...

  5. python end用法_python中end的使用方法

    python中end的使用方法 发布时间:2020-06-17 09:47:13 来源:亿速云 阅读:178 这篇文章给大家分享的是有关python中end的使用方法,小编觉得挺实用的,因此分享给大家 ...

  6. python 字符串拼接_Python中拼接字符串的方法 | 萧小寒

    摘要 在编程语言中,几乎每种语言都有关于字符串的操作方法或函数.原因很简单,字符串做为编程语言中不可或缺的数据类型,有着不可以替代的重要性.不同的是,每种编程语言对于字符串的处理方式都有自己的特色.这 ...

  7. python调用包中的方法_python 中不同包 类 方法 之间的调用详解

    目录结构如下: 在hello.py中导入ORM.py这个文件的时候,采用 import ORMPackage.ORM 或者 import ORM u = User(id = 123, name='co ...

  8. python库的调用三种方法_python中调用库的方法

    python中调用库的方法 发布时间:2020-09-02 11:41:21 来源:亿速云 阅读:93 作者:小新 小编给大家分享一下python中调用库的方法,希望大家阅读完这篇文章后大所收获,下面 ...

  9. python浮点数的表示方法_python中的浮点数range方法

    我们知道python中有个range函数用来产生一个范围内的数字数组,但是浮点数没有,我们来定义一个 #python中的range函数支持步进,如下: >>> print range ...

  10. python中repr方法_Python中的常见特殊方法—— repr方法

    在Python中有些方法名.属性名的前后都添加了双下划线,这种方法.属性通常都属于Python的特殊方法和特殊属性,开发者可以通过重写这些方法或者直接调用这些方法来实现特殊的功能.其实前面见过的构造方 ...

最新文章

  1. 深度学习中的优化算法与实现
  2. 限制edit只能输入数字
  3. ENISA报告:ICS-SCADA防护建议
  4. Minimum Inversion Number HDU - 1394(权值线段树/树状数组)
  5. 插入排序——3希尔排序实现
  6. 【转载】计算几何题目集锦
  7. android design library提供的TabLayout的用法
  8. python 调用父类方法, 重写父类构造方法, 不显式调用,会报错
  9. spark sql 对接 HDFS
  10. 机械工程专业英语复习
  11. 新华三杯考前突击---Day1---物联网技术篇
  12. 自顶向下与自底向上编程思想的对比
  13. 通达OA-医疗卫生行业系统解决方案
  14. php实现豆瓣isbn查询API接口制作
  15. 树莓派做网络代理_【树莓派】设置代理服务器联网
  16. 电商短视频运营应该怎么做
  17. 【PM学习笔记】酸梅干超人 - 零基础学Figma学习笔记
  18. 【C++】.h文件与.c文件的区别
  19. aseprite手机版_texture packs泰拉瑞亚
  20. 群晖moments套件识别拍摄日期为1970错误的解决方法

热门文章

  1. 「BZOJ3226」[Sdoi2008]校门外的区间
  2. Banner 自动无限轮播(普通)
  3. Effective Objective-C [下]
  4. uva673 Parentheses Balance
  5. mapxtreme开发资料全集
  6. python、语言的主网站网址是-国产编程语言木兰被网友扒皮:原来是Python语言打包...
  7. python小程序代码50 到100行-Python代码不到四十行简单暴力,微信跳一跳小程序轻松过万...
  8. anaconda的python使用教程-Python,Anaconda简介安装使用教程
  9. python 代码-你见过哪些令你瞠目结舌的 Python 代码技巧?
  10. python3视频教程-Python3深度学习视频学习路线