亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

bisect函數怎么在Python中使用

發布時間:2021-03-22 16:54:34 來源:億速云 閱讀:191 作者:Leah 欄目:開發技術

今天就跟大家聊聊有關bisect函數怎么在Python中使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

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]

看完上述內容,你們對bisect函數怎么在Python中使用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武平县| 特克斯县| 建宁县| 台南市| 加查县| 永新县| 成武县| 论坛| 南澳县| 西宁市| 蒙山县| 杭锦旗| 博白县| 津市市| 巨鹿县| 卓资县| 西乌珠穆沁旗| 永安市| 界首市| 长沙市| 白河县| 酒泉市| 大冶市| 怀宁县| 台北市| 宁远县| 白沙| 咸宁市| 龙南县| 新竹市| 米脂县| 烟台市| 绿春县| 罗源县| 双桥区| 常熟市| 纳雍县| 慈溪市| 丰宁| 吉林省| 雅安市|