日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深浅拷贝垃圾回收机制四大高阶函数

發布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深浅拷贝垃圾回收机制四大高阶函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄:

  • 淺拷貝和深拷貝
  • 垃圾回收機制
  • 高階函數

淺拷貝和深拷貝

  • 淺拷貝: 不管多么復雜的數據結構,淺拷貝都只會copy一層

  • 深拷貝 : 深拷貝會完全復制原變量相關的所有數據,在內存中生成一套完全一樣的內容,我們對這兩個變量中任意一個修改都不會影響其他變量

  • 圖例:

  • 代碼展示

import copy sourceList = [1,2,3,[4,5,6]] copyList = copy.copy(sourceList) deepcopyList = copy.deepcopy(sourceList)sourceList[3][0]=100print(sourceList) # [1, 2, 3, [100, 5, 6]] print(copyList) # [1, 2, 3, [100, 5, 6]] print(deepcopyList) # [1, 2, 3, [4, 5, 6]]

垃圾回收機制

引用計數

  • 原理
    1)當一個對象的引用被創建或者復制時,對象的引用計數加1;當一個對象的引用被銷毀時,對象的引用計數減1.
    2)當對象的引用計數減少為0時,就意味著對象已經再沒有被使用了,可以將其內存釋放掉。

  • 優點

引用計數有一個很大的優點,即實時性,任何內存,一旦沒有指向它的引用,就會被立即回收,而其他的垃圾收集技術必須在某種特殊條件下才能進行無效內存的回收。

  • 缺點
  • 引用計數機制所帶來的維護引用計數的額外操作與Python運行中所進行的內存分配和釋放,引用賦值的次數是成正比的,
  • 這顯然比其它那些垃圾收集技術所帶來的額外操作只是與待回收的內存數量有關的效率要低。
  • 同時,因為對象之間相互引用,每個對象的引用都不會為0,所以這些對象所占用的內存始終都不會被釋放掉。

標記-清除
1.說明
1)它分為兩個階段:第一階段是標記階段,GC會把所有的活動對象打上標記,第二階段是把那些沒有標記的對象非活動對象進行回收。
2)對象之間通過引用(指針)連在一起,構成一個有向圖
3)從根對象(root object)出發,沿著有向邊遍歷對象,可達的(reachable)對象標記為活動對象,不可達的對象就是要被清除的非活動對象
根對象就是全局變量、調用棧、寄存器。
注:像是PyIntObject、PyStringObject這些不可變對象是不可能產生循環引用的,因為它們內部不可能持有其它對象的引用。

  • 在上圖中,可以從程序變量直接訪問塊1,并且可以間接訪問塊2和3,程序無法訪問塊4和5
  • 第一步將標記塊1,并記住塊2和3以供稍后處理。
  • 第二步將標記塊2,第三步將標記塊3,但不記得塊2,因為它已被標記。
  • 掃描階段將忽略塊1,2和3,因為它們已被標記,但會回收塊4和5。
  • 2.缺點:
    1)標記清除算法作為Python的輔助垃圾收集技術,主要處理的是一些容器對象,比如list、dict、tuple等 因為對于字符串、數值對象是不可能造成循環引用問題。
    2)清除非活動的對象前它必須順序掃描整個堆內存,哪怕只剩下小部分活動對象也要掃描所有對象。

    分代回收

  • 分代回收是建立在標記清除技術基礎之上的,是一種以空間換時間的操作方式。
  • Python將內存分為了3“代”,分別為年輕代(第0代)、中年代(第1代)、老年代(第2代)
  • 他們對應的是3個鏈表,它們的垃圾收集頻率與對象的存活時間的增大而減小。
  • 新創建的對象都會分配在年輕代,年輕代鏈表的總數達到上限時,Python垃圾收集機制就會被觸發
  • 把那些可以被回收的對象回收掉,而那些不會回收的對象就會被移到中年代去,依此類推
  • 老年代中的對象是存活時間最久的對象,甚至是存活于整個系統的生命周期內。
  • 高階函數

    lambda基本使用

  • lambda只是一個表達式,函數體比def簡單很多。
  • lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
  • lambda表達式是起到一個函數速寫的作用。允許在代碼內嵌入一個函數的定義。
  • 格式:lambda的一般形式是關鍵字lambda后面跟一個或多個參數,緊跟一個冒號,之后是一個表達式。
  • lambda函數基本使用

    f = lambda x,y,z:x+y+z print(f(1,2,3)) # 6my_lambda = lambda arg : arg + 1 print(my_lambda(10)) # 11
    • filter()函數

    可以對序列做過濾處理,就是說可以使用一個自定的函數過濾一個序列,把序列的每一項傳到自定義

    filter()函數有兩個參數:

    • 第一個,自定函數名,必須的
    • 第二個,需要過濾的列,也是必須的

    簡單舉例使用

    #利用filter,lambda表達式,獲取列表中小于33的所有元素 l1= [11,22,33,44,55] a = filter(lambda x: x<33, l1) print(list(a))
    • Map是對序列根據設定條件進行操作后返回他設置的是操作方法, map使用:第一個參數接收一個函數名,第二個參數接收一個可迭代對象

    map函數的簡單使用

    list = [1, 2, 3, 4, 5, 6] def add(num):return num + 1 rs = map(add, lt) print(list(rs)) #運行結果: [2, 3, 4, 5, 6, 7]

    利用map,lambda表達式將所有偶數元素加100

    l1= [11,22,33,44,55] ret = map(lambda x:x if x % 2 != 0 else x + 100,l1) print(list(ret)) # 運行結果: [11, 122, 33, 144, 55]

    總結:filter()和map()函數區別:

    • Filter函數用于對序列的過濾操作,過濾出需要的結果,一次性返回他的過濾設置于的是條件

    • Map函數是對序列根據設定條件進行操作后返回他設置的是操作方法,無論怎樣都會返回結果

    • reduce函數

    (1) reduce()函數即為化簡函數,它的執行過程為:每一次迭代,都將上一次的迭代結果與下一個元素一同傳入二元func函數中去執行

    (2) 在reduce()函數中,init是可選的,如果指定,則作為第一次迭代的第一個元素使用,如果沒有指定,就取seq中的第一個元素

    使用reduce進行求和運算

    from functools import reduce def f(x, y):return x + yprint(reduce(f, [1, 3, 5, 7, 9])) # 25 # 1、先計算頭兩個元素:f(1, 3),結果為4; # 2、再把結果和第3個元素計算:f(4, 5),結果為9; # 3、再把結果和第4個元素計算:f(9, 7),結果為16; # 4、再把結果和第5個元素計算:f(16, 9),結果為25; # 5、由于沒有更多的元素了,計算結束,返回結果25。print( reduce(lambda x, y: x + y, [1, 3, 5, 7, 9]) ) # 25

    使用reduce將字符串反轉

    s = 'Hello World' from functools import reduceresult = reduce(lambda x,y:y+x,s) # 1、第一次:x=H,y=e => y+x = eH # 2、第二次:x=l,y=eH => y+x = leH # 3、第三次:x=l,y=leH => y+x = lleH print( result ) # dlroW olleH
    • sorted函數

    1)sorted和sort區別

    • sort 是應用在 list 上的方法,sorted 可以對所有可迭代的對象進行排序操作。
    • sort 是對已經存在的列表進行操作,無返回值,而 sorted 方法返回的是一個新的 list,而不是在原來的基礎上進行的操作。

    2)sorted使用
    sorted 語法:sorted(iterable, cmp=None, key=None, reverse=False)

  • iterable – 可迭代對象
  • cmp – 比較的函數
  • key – 主要是用來進行比較的元素,只有一個參數,具體的函數的參數就是取自于可迭代對象中,指定可迭代對象中的一個元素來進行排序
  • reverse – 排序規則,reverse = True 降序 , reverse = False 升序(默認)
  • sorted對列表排序

    students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] print( sorted(students, key=lambda s: s[2], reverse=False) ) # 按年齡排序 # 結果:[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

    sorted對字典排序

    d = {'k1':1, 'k3': 3, 'k2':2} # d.items() = [('k1', 1), ('k3', 3), ('k2', 2)] a = sorted(d.items(), key=lambda x: x[1]) print(a) # [('k1', 1), ('k2', 2), ('k3', 3)]

    總結

    以上是生活随笔為你收集整理的深浅拷贝垃圾回收机制四大高阶函数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。