欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中bisect的使用方法

 更新時間:2019年12月31日 10:31:20   作者:北洛  
這篇文章主要介紹了Python中bisect的使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

Python中列表(list)的實現(xiàn)其實是一個數組,當要查找某一個元素的時候時間復雜度是O(n),使用list.index()方法,但是隨著數據量的上升,list.index()的性能也逐步下降,所以我們需要使用bisect模塊來進行二分查找,前提我們的列表是一個有序的列表。

遞歸二分查找和循環(huán)二分查找

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模塊來測試兩個方法執(zhí)行,timeit模塊的timeit方法默認會對需要測試的函數執(zhí)行1000000,然后返回執(zhí)行的時間。

>>> 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

可以看到,循環(huán)二分查找比遞歸二分查找性能要來的好些?,F(xiàn)在,我們先用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模塊的二分查找的性能比循環(huán)二分查找快一倍。再來對比一下,如果用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()執(zhí)行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讀寫Excel表格的實例代碼(簡單實用)

    python讀寫Excel表格的實例代碼(簡單實用)

    這篇文章主要介紹了python讀寫Excel表格的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • 在Django中動態(tài)地過濾查詢集的實現(xiàn)

    在Django中動態(tài)地過濾查詢集的實現(xiàn)

    本文主要介紹了Django中動態(tài)地過濾查詢集的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 使用Python對MySQL數據操作

    使用Python對MySQL數據操作

    本文介紹Python3使用PyMySQL連接數據庫,并實現(xiàn)簡單的增刪改查。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • python爬蟲搭配起B(yǎng)ilibili唧唧的流程分析

    python爬蟲搭配起B(yǎng)ilibili唧唧的流程分析

    這篇文章主要介紹了python爬蟲搭配起B(yǎng)ilibili唧唧的流程分析,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • python基礎梳理(一)(推薦)

    python基礎梳理(一)(推薦)

    這篇文章主要介紹了python基礎梳理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • python根據出生年份簡單計算生肖的方法

    python根據出生年份簡單計算生肖的方法

    這篇文章主要介紹了python根據出生年份簡單計算生肖的方法,通過一個非常簡單的自定義函數實現(xiàn)輸入年份得到生肖的功能,非常實用,需要的朋友可以參考下
    2015-03-03
  • python實現(xiàn)計算器小功能

    python實現(xiàn)計算器小功能

    這篇文章主要為大家詳細介紹了python實現(xiàn)計算器小功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Python入門學習之字符串與比較運算符

    Python入門學習之字符串與比較運算符

    這篇文章主要介紹了Python入門學習之字符串與比較運算符,是Python語法中的基礎知識,需要的朋友可以參考下
    2015-10-10
  • 對python中的裝包與解包實例詳解

    對python中的裝包與解包實例詳解

    今天小編就為大家分享一篇對python中的裝包與解包實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 詳解使用PyInstaller將Pygame庫編寫的小游戲程序打包為exe文件

    詳解使用PyInstaller將Pygame庫編寫的小游戲程序打包為exe文件

    這篇文章主要介紹了詳解使用PyInstaller將Pygame庫編寫的小游戲程序打包為exe文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08

最新評論