Python現狀

我是誰,我在哪發表於2019-05-18

python升級及原因

  1. 語言之前的競爭
  2. python的很多改進往往是由特定的應用領域的需求驅動的。其中最重要的領域是web開發,這一領域需要pyton改進對並非的處理
  3. 有些變化只有由於python專案的歷史原因導致的。這些年已經發現了python的一些不合理之處,有些標準庫結構混亂和冗餘,有些事程式設計缺陷。

追蹤python最新變化----PEP文件(Python改進提案)

  1.   提交了的pep文件路徑:http://www.python.org/dev/peps/pep-0001
  2.   只有釋出了pep穩定,新的變化才會生效
  3.   彙總python核心開發者的需要的資訊,並通知python發不日程
  4.   提供程式碼風格,文件或其他指導意見
  5.   對提交的功能進行說明

當前python的普及程度

    造成普及程度低這種狀況的主要原因是,將現有應用從Python 2遷移到Python 3上總是一項不小的挑戰。像2to3之類的工具可以進行程式碼自動轉換,但無法保證轉換後的程式碼100%正確。而且,如果不做人工修改的話,轉換後的程式碼效能  可能不如轉換前。將現有的複雜程式碼庫遷移到Python 3上可能需要付出巨大的精力和成本,某些公司可能無法負擔這些成本。但這些成本可以分割成小份來逐步完成。一些優秀的軟體架構設計方法可以幫助其逐步實現這一目標,如面向服務的架構或者微服務。新的專案元件(服務或微服務)可以用新方法編寫,現有的專案元件可以逐步遷移。

長遠來看,將專案遷移到Python 3只有好處。根據PEP-404這份文件,Python 2.x分支將不會發布2.8版本。而且未來所有重要的專案(如Django、Flask和NumPy)可能都將放棄2.x的相容性,僅支援Python 3

 

python3和python2的主要差異

  1. 語法變化,刪除或修改了一些語法元素,並新增了一些新的語法元素
    • 捕獲異常的語法由except exc,var 改為except exc as var
    • 棄用比較運算子<>,改用!=
    • from module import *(....)只能用於模組,不能用於函式
    • 其他參考:https://www.cnblogs.com/hanggegege/p/5840005.html
  2. 標準庫中的變化\

一般情況下標準庫變化 刪除或重組的模組(例如urlparse遷移到了urllib.parse),在執行解釋就會丟擲異常。這樣的問題很容易發現,但是也需要保證完整程式碼的測試覆蓋率。但是在某些情況下(

例如:延遲載入的模組),這些模組通常不會拋異常,直到呼叫該模組時才會拋異常,因此完整且每行程式碼的都需要實際執行一遍

3.資料型別與集合的變化

版本相容性版本號說明

  1. 主版本號(MAJOR):當你做了不相容API的修改
  2. 次版本號(MINOR):當你做了向後相容的功能性新增
  3. 修訂號(PATCH):當你做了向後相容的問題修改

python的__future__模組

它將python新版本中的一些功能反向遷移到舊版本中

https://www.cnblogs.com/evablogs/p/6688478.html

在某些情況下,開發人員不想在一些小型python包裡新增其他依賴項,通常做法就是將所有相容性的程式碼放在一個附加模組中,該模組通常命名為compat.py.下面是compat模組例項

# -*- coding:utf-8 -*-
import sys
if sys.version_info<(3,0,0,):
    import urlparse
    def is_string(s):
        return isinstance(s,basestring)
else:
    from urllib import  parse as urlparse
    def is_string(s):
        return isinstance(s,str)

 python的幾種實現

CPython:用C編寫,大多數使用的python

Stackless Python:增強版,沒有依賴C語言的呼叫棧。實際上是修改過的CPython,並新增了一些新功能。最新版本為2.7.9和3.3.5分別實現python2.7和3.3。在stackless python中,所有的額外模組都內建在stackless模組內的框架/

stackless python引入的思想對程式設計有很大影響。將stackless python中的核心切換功能提取出來並作為一個獨立包釋出,叫greenlet。它的大部分功能在pypy中重新實現

Jpython:用java編寫,它將程式碼編譯為java位元組碼,在python模組中可以無縫使用java。Jpython執行人們在複雜應用程式(J2EE)中使用python作為頂層指令碼語言。Jpython的一個很好例子就是在python程式中可以使用Apache Jackrabbit

Jython和Cpython實現的主要區別如下所示:

真正的java垃圾回收,而不是引用計數;沒有全域性解鎖器鎖(GIL),在多執行緒應用中可以充分利用多個核心;

缺點是:缺少對CPythonAPI的支援,用C編寫的python無法在Jython中執行。Jython3.x計劃支援

IronPython:將python引用Net框架中,主要是net開發人員使用

和CPtyhon的主要區別如下所示:

沒有全域性解鎖器鎖(GIL),在多執行緒應用中可以充分利用多個核心;

用C#和其他.net語言編寫的程式碼可以輕鬆整合到IronPython中,反之亦然;缺點也是缺少對CPythonAPI的引用

PyPy:最令人興奮的Pytho實現,因為其目標就是將python重寫為python,在pypy中,python直譯器本身使用python編寫的。在python的CPython實現中,有一個C程式碼層來實現具體細節,但是在pypy中,這個c程式碼層完全用python實現。

和CPython的主要區別如下所示:

    1. 使用垃圾回收,而不是引用計數器
    2. 整合跟蹤JIT編譯器,可以顯著提高效能,比CPython快好幾倍,基於此,使得越來越多的開發人員決定在生產環境中切換到pypy
    3. 借鑑了Stackless Python在應用層的無棧特性

缺點也是缺少對CPython擴充套件API的完全官方支援

 

 Python隔離環境:

  1. 手動修改Path和PythonPath環境變數或將python二進位制檔案遷移到其他位置
  2. 使用工具建立虛擬執行環境:virtualenv,venv和buildout
  3. virtualenv介紹及基本使用  https://blog.csdn.net/weixin_37773766/article/details/80773590

 

 

 

相關文章