[python學習手冊-筆記]001.python前言

001.python前言

本系列文章是我個人學習《python學習手冊(第五版)》的學習筆記,其中大部分內容為該書的總結和個人理解,小部分內容為相關知識點的擴展。

非商業用途轉載請註明作者和出處;商業用途請聯繫本人([email protected])獲取許可。

關於python優缺點的分析

  • python可讀性高,移植性較好
  • 代碼簡潔,完成同樣的問題相比java和C++,代碼量是其的1/5~1/3
  • 效率相對C語言叫差,但也不是那麼差
  • 開源,社區活躍度很高,官方和民間提供了很多的庫可以直接使用

這裡引申出一個問題,關於開源的優缺點。以下內容為個人理解,僅代表我的個人觀點,不具備權威性

開源的優點

1)源代碼開放,相對比較安全;

2)開源軟件大部分可以免費使用,即使需要付費許可,其許可費用相對也比較低。

3)開源軟件的社區一般比較活躍,軟件更新迭代速度很快。

關於開源軟件的缺點

1)開源軟件一般由相應的社區維護,其迭代速度取決於社區的活躍度。而且有可能因為開發人員的興趣轉移或者其他因素導致軟件停止維護,存在一定的風險

2)開源軟件的使用門檻相對來說比較高,雖然節省了開發成本,但是對部署和維護人員來說,要求一定的技術能力。比如,如果使用商業軟件,後期的支持等工作可以由軟件提供商負責,而開源軟件並不存在響應的責任部門,所以部署維護全要靠自己的技術人員完成。這也就是為啥雖然開源軟件許可費用很低甚至免費,很多公司機構依舊會選用商業軟件的原因。畢竟能用錢解決的問題,對於有錢人來說都不是問題。

3)開源軟件缺乏主導的控制,開源社區是一個自由度相對較高的社區。缺乏絕對的主導。這就會因為開源社區過於活躍,導致版本分支的混亂。

python運行過程

python是個解釋型語言。這句話說的對,但不完全對。

首先簡單說明下解釋型語言和編譯型語言:

  • 編譯型語言:源代碼被編譯器經過一連串的處理最終生成的是和處理器指令集強相關的,可以被處理器直接執行的二進制文件。

    • 典型的C語言和C++。以常用的GCC編譯器為例,從代碼編程可執行的二進制文件要經過預編譯->編譯->彙編->鏈接等多個步驟。
    • 優點:編譯型語言從源碼到可執行二進制文件時在運行前就已經完成的。所以在執行的時候不需要再次處理源碼,效率較高
    • 缺點:同樣的,因為源碼在執行前已經被處理成為處理器強相關的二進制文件,所以移植性很差。
  • 解釋型語言:源代碼由解釋器運行時逐句翻譯成機器碼。

    • java,python等語言都屬於這一類。但是又不嚴格的屬於這一類。因為現在所謂的解釋型語言都有所謂的優化,實際解釋器在翻譯的並不是源碼,而是經過預處理的「半成品」
    • 優點:由解釋器執行翻譯,平台不相關,移植性好。
    • 缺點:

      • 效率低
      • 因為平台和源碼之間還有個解釋器,所以在部署的時候,需要先安裝相關的運行環境比如java的jre等。當然也可以打包成對應的二進制文件,像py2exe這樣的工具,但是它也是將python解釋器和源碼(位元組碼)同時打包了而已。

python的運行過程

  • 源碼(.py)先被解釋器處理成位元組碼(.pyc)
  • 程序運行時,位元組碼(.pyc)被解釋器解釋成可執行的指令

關於程序執行這一塊暫時不講,在後續的「有生之年系列」可能會有相關文章講述這一塊。

這裡簡答說一下位元組碼.pyc文件的生成。首先,位元組碼是一種平台無關的,低級的表現形式,主要用來提高運行速度。

如果python解釋器具有寫入的權限,在python3.2之前,位元組碼文件會被保存在源碼目錄下的子目錄__pycache__中,且解釋器版本信息會保存在對應的.pyc文件內。在python3.2之後,位元組碼文件依舊會保存在該目錄下,但是版本信息會保存在文件名中,如下圖所示:

image-20201109233951859
image-20201109233951859

如果python解釋器不具備寫入權限,同樣會生成位元組碼文件,但是該文件會保存在內存中.

何時重新編譯

如果源碼沒有修改的話,在再次執行該代碼的時候,python解釋器會直接解釋對應的位元組碼文件而不需重新”編譯”(注意,這個編譯是打了引號的.)位元組碼.那麼何時重新”編譯”位元組碼呢?兩種情況:

  • 源文件改變: python解釋器會檢查源文件和位元組碼文件的最後修改的時間戳,如果時間不一致,則重新”編譯”位元組碼
  • 解釋器版本改變: 如果位元組碼文件所使用的的解釋器版本和當前執行代碼所使用的解釋器版本不一致,則重新”編譯”

python的解釋器

python的解釋器有很多實現,這裡介紹一下比較出名的幾個.了解一下就好,畢竟用的最多的還是標準的CPython.

  • CPython: 由ANSI C語言實現,是標準的Python解釋器.

    • 我們在python官網下載的python套件中使用的就是CPython
    • 運行速度最快,最完成,最新,最健全
  • Jython: 這玩意兒的目的是將Python和Java集成,將Python源碼翻譯成Java的位元組碼以便於使其運行在JVM上.
  • IronPython: 和Jython差不多,但是這傢伙的目的是使python運行在.net框架之下.
  • Stackless: CPython針對並發的優化,引入了協程的概念
  • PyPy: 採用JIT(just in time)技術,據說可以比python甚至C語言更快,在算法密集和計算密集的場景下性能更為突出.(這塊不懂,不敢瞎白話)

本文使用 mdnice 排版

Tags: