1. 程式人生 > >python高階語法(一)

python高階語法(一)

文章目錄

GIL全域性直譯器鎖

什麼是GIL全域性直譯器鎖

GIL是僅存在與CPython中的一把鎖

GIL產生的背景 在CPython解釋內部執行多個執行緒的時候,每個執行緒都需要直譯器內部申請相應的全域性資源,由於C語言本身比較底層造成CPython在管理所有全域性資源的時候並不能應對所有執行緒同時的資源請求,因此為了防止資源競爭而發生錯誤,對所有執行緒申請全域性資源增加了限制-全域性直譯器鎖。

因此,全域性直譯器鎖就是鎖住了整個直譯器內部的全域性資源,一次只能給一個執行緒使用。這就造成了在CPython中,同一個程序下同時只能有一個執行緒去執行。因此,同一程序下的各個執行緒之間只能併發執行,不能真的實現並行。

執行緒何時會釋放GIL鎖

在python執行緒正,如果遇到IO操作等耗時操作,或者執行時間達到閾值就會釋放當前的GIL鎖。接下來要想繼續執行,必須重新獲取GIL鎖。

如何避免這種現象

  1. GIL鎖只存在CPython中,所以換一個直譯器就可以避免。
  2. GIL鎖是對同一程序中執行緒限制,因此可以使用多程序來避免這種情況。
  3. 換其他語言編寫程式。。。

多執行緒單執行緒的選擇

在單純進行大量計算操作的時候可以選擇單執行緒
在進行諸如網路爬取等需要大量IO操作的程式時,可以選擇多執行緒

深拷貝~淺拷貝

物件之間的賦值,本質上就是物件之間引用的傳遞而已

按資料型別分類

1、 拷貝單一的可變的簡單資料型別 a = []

深拷貝和淺拷貝一樣 都會開闢一片新的空間儲存資料 都可以保證資料的獨立性

2 、拷貝複雜的有巢狀的可變資料型別的時候 a = [[],[]]

淺拷貝:只會開闢一片空間存貯的是引用 無法保證資料的獨立性
深拷貝:會開闢多個空間存貯所有的資料 可以保證資料的獨立性的

3、 拷貝不可變型別(常量,字串,元組)

深拷貝和淺拷貝都一樣 都不會開闢新的空間 而是直接引用 不可變資料型別資料是無法發生改變的 不需要保證資料獨立性

4、 不可變型別中巢狀可變型別

淺拷貝 只會關心最外層的資料型別 如果最外層是不可變的資料型別 直接引用 無法保證資料的獨立性
深拷貝 進行遞迴的查詢 只要發現有可變型別 就會開闢足夠多的空間儲存資料 可以保證資料的獨立性的

5、 字典拷貝和切片拷貝

python中自帶的大多數拷貝都是淺拷貝

import匯入模組

在python中我們常用兩種方式匯入模組,分別是import和from-import

模組匯入路徑問題

有時,在我們編寫程式時雖然已經匯入了所有需要的模組,但是程式卻無法正確執行。就有可能是模組匯入路徑的問題。
在python中,匯入sys模組後可以呼叫sys.path()方法來檢視python的預設匯入模組路徑。
程式碼如下:

import sys
# 由於sys.path是一個列表,所以遍歷輸出
for i in sys.path:
    print(i)

我的輸出結果是:

E:\PyPractices\草稿本
E:\PyPractices\草稿本
E:\python\python37.zip
E:\python\DLLs
E:\python\lib
E:\python
C:\Users\10145\AppData\Roaming\Python\Python37\site-packages
E:\python\lib\site-packages
E:\python\lib\site-packages\pyinstaller-3.4-py3.7.egg
E:\python\lib\site-packages\pywin32_ctypes-0.2.0-py3.7.egg
E:\python\lib\site-packages\altgraph-0.16.1-py3.7.egg
E:\python\lib\site-packages\macholib-1.11-py3.7.egg
E:\python\lib\site-packages\pefile-2018.8.8-py3.7.egg
E:\python\lib\site-packages\future-0.16.0-py3.7.egg
E:\PyCharm 2018.2.3\helpers\pycharm_matplotlib_backend

在以上所有路徑中,python會從上往下去尋找你要匯入的模組,找到即停止。因此就會有可能出現以上咱們提到的問題。例如我需要匯入一個aaa.py,但是我的電腦中有兩個該檔案分別儲存在第一個路徑和第二個路徑中。此時python便會預設匯入第一個。如果我恰好需要的是第二個,那便會出現發現不了的錯誤了。
解決辦法

  1. 按路徑匯入
  2. 更改路徑順序

import和from-import的區別

有點類似於深拷貝和淺拷貝,import匯入的是路徑,變數會隨著原變數的改變而改變。
from-import匯入的是具體的值,相當於在本檔案中重新建立了變數物件。
另外,用import匯入模組後,在呼叫時需要帶上模組名,而from-import不用。這樣看來,似乎是更方便了,但是也存在一個問題就是容易出現模組中變數名和現有程式碼中變數名重複的現象。這樣的話也有可能出現莫名的錯誤。因此,在兩種匯入方式之間應該酌情選擇。