Python高級語法1:GIL鎖&淺拷貝&深拷貝

一巡验、GIL鎖

  • 1.1损离、GIL面試題:描述Python GIL的概念, 以及它對python多線程的影響涉兽?編寫一個(gè)多線程抓取網(wǎng)頁的程序招驴,并闡明多線程抓取程序是否可比單線程性能有提升篙程,并解釋原因枷畏。

    • Guido的聲明: he language doesn't require the GIL -- it's only the CPython virtual machine that has historically been unable to shed it.
  • 1.2、參考答案:

    • (1)虱饿、Python語言和GIL沒有半毛錢關(guān)系拥诡。僅僅是由于歷史原因在Cpython虛擬機(jī)(解釋器),難以移除GIL氮发。
    • (2)渴肉、GIL:全局解釋器鎖。每個(gè)線程在執(zhí)行的過程都需要先獲取GIL爽冕,保證同一時(shí)刻只有一個(gè)線程可以執(zhí)行代碼仇祭。
    • (3)、線程釋放GIL鎖的情況: 在IO操作等可能會(huì)引起阻塞的system call之前,可以暫時(shí)釋放GIL,但在執(zhí)行完畢后,必須重新獲取GIL Python 3.x使用計(jì)時(shí)器(執(zhí)行時(shí)間達(dá)到閾值后颈畸,當(dāng)前線程釋放GIL)或Python 2.x乌奇,tickets計(jì)數(shù)達(dá)到100
    • (4)、Python使用多進(jìn)程是可以利用多核的CPU資源的眯娱。
    • (5)礁苗、多線程爬取比單線程性能有提升,因?yàn)橛龅絀O阻塞會(huì)自動(dòng)釋放GIL鎖

二徙缴、淺拷貝

  • 2.1试伙、淺拷貝是對于一個(gè)對象的頂層拷貝,簡單的理解是:拷貝了引用于样,并沒有拷貝內(nèi)容疏叨。

  • 2.2、 看一個(gè)最簡單的淺拷貝

    最簡單的淺拷貝

    以上:a 與 b 的內(nèi)存地址相同穿剖,說明了當(dāng)給一個(gè)變量賦值的時(shí)候蚤蔓,其實(shí)就是將數(shù)據(jù)的引用賦值了一份給另外一個(gè)變量,這其實(shí)就是最簡單的淺拷貝,不僅列表是這樣携御,只要是 類似于 xx1 = xx2 的這種基本都是 淺拷貝昌粤,如下:

    >>> c = {"age":23}
    >>> d = c
    >>> id(c)
    4527333240
    >>> id(d)
    4527333240
    >>> c["name"] = "王小二"
    >>> c
    {'age': 23, 'name': '王小二'}
    >>> d
    {'age': 23, 'name': '王小二'}
    

    因?yàn)槎际菧\拷貝,所以只要通過一個(gè)引用進(jìn)行了修改啄刹,那么另外一個(gè)變量就看到的數(shù) 據(jù)也就變化了

  • 2.3涮坐、import copy 模塊中 copy.copy() 的使用

    >>> a = [11,22]
    >>> b = [33,44]
    >>> c = [a,b]
    >>> id(a)
    4528760776
    >>> id(b)
    4528427464
    >>> id(c)
    4528012488
    >>> import copy
    >>> d = copy.copy(c)
    >>> id(d)
    4528788488
    >>> id(d[0])
    4528760776
    >>> id(d[1])
    4528427464
    >>> a.append(55)
    >>> c
    [[11, 22, 55], [33, 44]]
    >>> d
    [[11, 22, 55], [33, 44]]
    
    淺拷貝只會(huì)復(fù)制最頂層的那個(gè)列表

    淺拷貝 只會(huì)復(fù)制最頂層的那個(gè)列表

三、深拷貝

  • 3.1誓军、深拷貝是對于一個(gè)對象所有層次的拷貝(遞歸)

    >>> a = [11,22]
    >>> b = copy.deepcopy(a)
    >>> a
    [11, 22]
    >>> b
    [11, 22]
    >>> id(a)
    4528761928
    >>> id(b)
    4528933000
    

    以上結(jié)果通過deepcopy()確實(shí)將列表 a 中所有的數(shù)據(jù)的引用 copy 了袱讹,而不是只拷貝了 a 指向的列表的引用,看如下,a的數(shù)據(jù)發(fā)生變化的時(shí)候,b并不會(huì)發(fā)生變化

    >>> a.append(55)
    >>> a
    [11, 22, 55]
    >>> b
    [11, 22]
    
  • 3.2捷雕、進(jìn)一步理解 深拷貝

    進(jìn)一步理解 深拷貝

    深拷貝: 我個(gè)人理解其實(shí)是:深拷貝后與原來的對象沒有任何關(guān)系了椒丧,不管原來的對象如何變化,都不再會(huì)影響到深拷貝后的對象

四救巷、拷貝的其他方式

  • 4.1壶熏、分片表達(dá)式 可以賦值一個(gè)序列

    >>> a = [11,22]
    >>> b = [33,44]
    >>> c = [a,b]
    >>> d = c[:]
    >>> id(c)
    4528760776
    >>> id(d)
    4528932936
    >>> id(c[0])
    4528933000
    >>> id(d[0])
    4528933000
    >>> a
    [11, 22]
    >>> a.append(55)
    >>> c
    [[11, 22, 55], [33, 44]]
    >>> d
    [[11, 22, 55], [33, 44]]
    
    d=c[:]與d=copy.copy(c)一樣 屬于淺拷貝

    d=c[:]d=copy.copy(c) 一樣 屬于 淺拷貝

  • 4.2、字典的copy方法可以拷貝一個(gè)字典


    字典的copy方法可以拷貝一個(gè)字典

五浦译、注意點(diǎn)

  • 5.1棒假、淺拷貝對不可變類型和可變類型的copy不同

    • copy.copy 對于 可變類型,會(huì)進(jìn)行淺拷貝

      >>> a = [11,22]
      >>> b = copy.copy(a)
      >>> id(a)
      4528932552
      >>> id(b)
      4528932680
      >>> a.append(33)
      >>> a
      [11, 22, 33]
      >>> b
      [11, 22]
      

      解釋一下大家的對于a變化精盅,而b不變化的問題,因?yàn)閎拷貝的是a里面 11帽哑,22引用的指向,當(dāng)a添加 33的時(shí)候叹俏,而 11妻枕,22引用的指向并沒有發(fā)生變化,所以并不會(huì)發(fā)生變化

    • copy.copy 對于 不可變類型粘驰,不會(huì)拷貝屡谐,僅僅是指向

      >>> a = (11,22,33)
      >>> b = copy.copy(a)
      >>> id(a)
      4528768632
      >>> id(b)
      4528768632
      
    • 如果c是元組,那么copy時(shí)會(huì)晴氨,僅僅是元組的引用copy,而 deepcopy依然是深copy,即遞歸copy所有

      >>> a = [11,22]
      >>> b = [33,44]
      >>> c = (a,b)
      >>> d = copy.copy(c)
      >>> id(c)
      4528885256
      >>> id(d)
      4528885256
      >>> a.append(55)
      >>> c
      ([11, 22, 55], [33, 44])
      >>> d
      ([11, 22, 55], [33, 44])
      >>> e = copy.deepcopy(c)
      >>> id(c)
      4528885256
      >>> id(e)
      4528885448
      >>> a.append(66)
      >>> c
      ([11, 22, 55, 66], [33, 44])
      >>> e
      ([11, 22, 55], [33, 44])
      >>> 
      
  • 5.2康嘉、copy.copy和copy.deepcopy的區(qū)別

    • copy.copy

      >>> a = [11,22]
      >>> b = (a,)
      >>> c = [b,]
      >>> 
      >>> d = copy.copy(c)
      >>> 
      >>> c
      [([11, 22],)]
      >>> d
      [([11, 22],)]
      >>> a.append(33)
      >>> c
      [([11, 22, 33],)]
      >>> d
      [([11, 22, 33],)]
      >>> id(c)
      4528932936
      >>> id(d)
      4528012488
      >>> id(c[0])
      4528434200
      >>> id(d[0])
      4528434200
      
      copy.copy

      d = c # 讓d這個(gè)變量指向c指向的空間,d = copy.copy(c) # 復(fù)制所有c指向的數(shù)據(jù)到一個(gè)新的空間籽前,但是不會(huì)遞歸copy

    • copy.deepcopy

      >>> a = [11,22]
      >>> b = (a,)
      >>> c = [b]
      >>> 
      >>> d = copy.deepcopy(c)
      >>> 
      >>> c
      [([11, 22],)]
      >>> d
      [([11, 22],)]
      >>> 
      >>> id(c)
      4528932680
      >>> id(d)
      4528761928
      >>> 
      >>> id(c[0])
      4528913040
      >>> id(d[0])
      4528913096
      >>> 
      >>> a.append(33)
      >>> 
      >>> c
      [([11, 22, 33],)]
      >>> d
      [([11, 22],)]
      >>> 
      
      copy.deepcopy
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亭珍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子枝哄,更是在濱河造成了極大的恐慌肄梨,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挠锥,死亡現(xiàn)場離奇詭異众羡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蓖租,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門粱侣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蓖宦,你說我怎么就攤上這事齐婴。” “怎么了稠茂?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵柠偶,是天一觀的道長。 經(jīng)常有香客問我,道長诱担,這世上最難降的妖魔是什么毡证? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蔫仙,結(jié)果婚禮上料睛,老公的妹妹穿的比我還像新娘。我一直安慰自己匀哄,他們只是感情好秦效,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般郎逃。 火紅的嫁衣襯著肌膚如雪硕勿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天厦瓢,我揣著相機(jī)與錄音,去河邊找鬼。 笑死立哑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的姻灶。 我是一名探鬼主播铛绰,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼产喉!你這毒婦竟也來了捂掰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤曾沈,失蹤者是張志新(化名)和其女友劉穎这嚣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塞俱,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姐帚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了障涯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罐旗。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖唯蝶,靈堂內(nèi)的尸體忽然破棺而出九秀,到底是詐尸還是另有隱情,我是刑警寧澤生棍,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布颤霎,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏友酱。R本人自食惡果不足惜晴音,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缔杉。 院中可真熱鬧锤躁,春花似錦、人聲如沸或详。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霸琴。三九已至椒振,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梧乘,已是汗流浹背澎迎。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留选调,地道東北人夹供。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像仁堪,于是被迫代替她去往敵國和親哮洽。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355