最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中bisect的使用方法

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

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

遞歸二分查找和循環(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

為了比對(duì)一下兩者的性能,我們使用timeit模塊來(lái)測(cè)試兩個(gè)方法執(zhí)行,timeit模塊的timeit方法默認(rèn)會(huì)對(duì)需要測(cè)試的函數(shù)執(zhí)行1000000,然后返回執(zhí)行的時(shí)間。

>>> 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)二分查找比遞歸二分查找性能要來(lái)的好些。現(xiàn)在,我們先用bisect的二分查找測(cè)試一下性能

用bisect來(lái)搜索

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

對(duì)比之前,我們可以看到用bisect模塊的二分查找的性能比循環(huán)二分查找快一倍。再來(lái)對(duì)比一下,如果用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秒,相比之前的二分查找,性能簡(jiǎn)直慢到恐怖

用bisect.insort插入新元素

排序很耗時(shí),因此在得到一個(gè)有序序列之后,我們最好能夠保持它的有序。bisect.insort就是為這個(gè)而存在的

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]

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python?json?jsonl?的用法詳解

    python?json?jsonl?的用法詳解

    這篇文章主要介紹了python?json?jsonl?的用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • python數(shù)據(jù)可視化使用pyfinance分析證券收益示例詳解

    python數(shù)據(jù)可視化使用pyfinance分析證券收益示例詳解

    這篇文章主要為大家介紹了python數(shù)據(jù)可視化使用pyfinance分析證券收益的示例詳解及pyfinance中returns模塊的應(yīng)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • python pdb調(diào)試方法分享

    python pdb調(diào)試方法分享

    在交互環(huán)境中通常使用pdb.run來(lái)調(diào)試,下面學(xué)習(xí)一下使用方法,大家參考使用吧
    2014-01-01
  • 如何用python實(shí)現(xiàn)一個(gè)HTTP連接池

    如何用python實(shí)現(xiàn)一個(gè)HTTP連接池

    這篇文章主要介紹了如何用python實(shí)現(xiàn)一個(gè)HTTP連接池的步驟,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • 詳解Numpy中的廣播原則/機(jī)制

    詳解Numpy中的廣播原則/機(jī)制

    這篇文章主要介紹了Numpy中的廣播原則/機(jī)制,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • python中requests小技巧

    python中requests小技巧

    Requests 使用的是 urllib3,因此繼承了它的所有特性。Requests 支持 HTTP 連接保持和連接池,支持使用 cookie 保持會(huì)話,支持文件上傳,支持自動(dòng)確定響應(yīng)內(nèi)容的編碼,支持國(guó)際化的 URL 和 POST 數(shù)據(jù)自動(dòng)編碼?,F(xiàn)代、國(guó)際化、人性化。
    2017-05-05
  • Python中os.path.join函數(shù)的用法示例詳解

    Python中os.path.join函數(shù)的用法示例詳解

    這篇文章主要給大家介紹了關(guān)于Python中os.path.join函數(shù)用法的相關(guān)資料,os.path.join函數(shù)是Python標(biāo)準(zhǔn)庫(kù)中的一個(gè)函數(shù),用于將多個(gè)路徑組合成一個(gè)有效的路徑,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • Python實(shí)現(xiàn)批量Excel拆分功能

    Python實(shí)現(xiàn)批量Excel拆分功能

    在日常辦公中,我們經(jīng)常需要將包含多個(gè)Sheet頁(yè)的Excel文件拆分成多個(gè)獨(dú)立的Excel文件,下面我們就來(lái)看看如何使用Python實(shí)現(xiàn)批量Excel拆分的功能吧
    2025-02-02
  • Python使用線程來(lái)接收串口數(shù)據(jù)的示例

    Python使用線程來(lái)接收串口數(shù)據(jù)的示例

    今天小編就為大家分享一篇Python使用線程來(lái)接收串口數(shù)據(jù)的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Python使用vars輕松獲取對(duì)象屬性

    Python使用vars輕松獲取對(duì)象屬性

    vars?是?Python?內(nèi)置函數(shù)之一,它主要用于返回對(duì)象的?__dict__?屬性,本文將詳細(xì)介紹?vars?函數(shù)的用法,包括其基本語(yǔ)法、應(yīng)用場(chǎng)景等,有需要的可以參考下
    2024-12-12

最新評(píng)論

简阳市| 贵溪市| 正阳县| 邹平县| 吉木乃县| 晴隆县| 阜阳市| 巴东县| 旬邑县| 静乐县| 密山市| 兴安盟| 乌拉特后旗| 广德县| 雷波县| 汝城县| 舞钢市| 辉南县| 逊克县| 防城港市| 江川县| 兴国县| 揭西县| 肥西县| 北宁市| 兴山县| 东乡| 九江市| 琼结县| 平定县| 伊金霍洛旗| 会理县| 巧家县| 六盘水市| 维西| 彭州市| 永顺县| 湟中县| 东山县| 山阳县| 孙吴县|