Python 3.8新功能盤點:更快,更簡潔,更一致,更現代化

程式設計師啟航發表於2019-06-22
Python 3.8新功能盤點:更快,更簡潔,更一致,更現代化

從功能強大的新任務語法到底層大更新,Python 3.8邁向更現代的Python程式碼庫。

3.8是Python這個流行語言的最新版本,適用於從自動化指令碼編寫、機器學習到Web開發的所有內容。現在可以獲得官方測試版,Python 3.8帶來了許多靈活的語法更改,記憶體共享,更高效的序列化和反序列化,修改後的詞典等等。

當然,Python 3.8也引領了各種效能改進。總體結果是讓Python更快,更簡潔,更一致,更現代化。以下是Python 3.8中最新,最重要的內容。

賦值表示式

Python 3.8中最明顯的變化是賦值表示式,它使用了酷似海象的運算子(:=)。賦值表示式允許在表示式的上下文中將值賦給變數,甚至是尚不存在的變數,而不是作為獨立語句。

1.  while (line := file.readline()) != "end": 
2.  print(chunk)

在此示例中,如果變數行不存在,則建立變數行,然後從file.readline()分配值。然後檢查行以檢視它是否等於“結束”。如果不是,則讀取下一行,儲存在行中,測試,等等。

賦值表示式遵循Python中可理解的簡潔性的傳統,包括列表推導。在這裡,我們的想法是減少一些易於出現在某些Python程式設計模式中的繁瑣樣板。例如,上面的程式碼片段通常需要多於兩行程式碼才能表達。

強制某些引數僅為位置

函式定義的新語法,僅位置引數,允許開發人員強制某些引數僅為位置。這消除了關於函式定義中哪些引數是位置的以及哪些是關鍵字引數的任何歧義。

僅限位置引數可以定義場景,例如,函式接受任何關鍵字引數但也可以接受一個或多個位置。 Python內建函式通常就是這種情況,因此為Python開發人員提供了一種方法,可以增強語言的一致性。如果你依然在程式設計的世界裡迷茫,不知道自己的未來規劃可以加入我們的Python秋秋裙去784掉758文214字看看前輩們如何學習的!交流經驗!自己是一名高階python開發工程師,從基礎的python指令碼到web開發、爬蟲、django、資料探勘等,零基礎到專案實戰的資料都有整理。送給每一位python的小夥伴!分享一些學習的方法和需要注意的小細節

Python文件中的一個例子:

1.  def pow(x, y, z=None, /): 
2.  r = x**y 
3.  if z is not None: 
4.  r %= z 
5.  return r

/將位置與關鍵字引數分開; 在這個例子中,所有的引數都是位置的。在以前的Python版本中,z將被視為關鍵字引數。 給定上述函式定義,pow(2,10)和pow(2,10,5)是有效呼叫,但pow(2,10,z = 5)不是。

F字串除錯支援

f-string格式提供了一種方便(且效能更高)的方式來在同一表示式中列印文字和計算值或變數:

1.  x = 3  
2.  print(f'{x+1}')

這將列印4。

在f字串表示式的末尾新增=會列印f-string表示式本身的文字,後跟值:

1.  x = 3 
2.  print (f'{x+1=}')

這將列印x + 1 = 4。

多處理模組共享記憶體

使用Python 3.8,多處理模組現在提供了一個SharedMemory類,允許在不同的Python程式之間建立和共享記憶體區域。

在以前的Python版本中,只能通過將資料寫入檔案,通過網路套接字傳送或使用Python的pickle模組對其進行序列化來在程式之間共享資料。共享記憶體為在程式之間傳遞資料提供了更快的路徑,使Python能夠更有效地使用多個處理器和處理器核心。

共享記憶體段可以分配為位元組的原始區域,或者它們可以使用不可變的類似列表的物件,這些物件儲存Python物件的一小部分 - 數字型別,字串,位元組物件和None物件。

打字模組的改進

Python是動態型別的,但支援通過輸入模組使用型別提示,以允許第三方工具驗證Python程式。 Python 3.8為鍵入新增了新元素,以便更加可靠地進行檢查:

  • final decorator 和Final type annotation表明decorated/annotated 的物件不應在任何位置被覆蓋,子類化或重新分配。
  • Literal型別將表示式限制為特定值或值列表,不一定是相同型別。
  • TypedDict型別允許建立字典,其中與某些鍵關聯的值僅限於一個或多個特定型別。 請注意,這些限制僅限於在編譯時可以確定的內容,而不是在執行時。

新版本的pickle協議

Python的pickle模組提供了一種序列化和反序列化Python資料結構的方法,例如,允許將字典原樣儲存到檔案中並在以後重新載入。不同版本的Python支援不同級別的pickle協議,更新版本支援更廣泛的功能和更高效的序列化。

使用Python 3.8引入的pickle第5版提供了一種新方法,來pickle實現Python緩衝區協議的物件,例如位元組,記憶體檢視或NumPy陣列。新的pickle減少了必須為這些物件製作的記憶體副本數量。

像NumPy和Apache Arrow這樣的外部庫在他們的Python繫結中支援新的pickle協議。新的pickle也可以作為PyPI的Python 3.6和Python 3.7的附件提供。

可逆詞典

Python中的字典完全用Python 3.6重寫,使用PyPy專案提供的新實現。除了更快更緊湊外,詞典現在還具有其元素的固有順序;它們是在新增時訂購的,就像列表一樣。 Python 3.8允許在字典上使用reversed()。

效能改進

  • 許多內建方法和函式已經加速了20%到50%,因為其中許多方法和函式不必要地轉換傳遞給它們的引數。
  • 新的操作碼快取可以加速直譯器中的某些指令。但是,目前唯一實現的加速是針對LOAD_GLOBAL操作碼,現在快40%。計劃對更高版本的Python進行類似的優化。
  • 檔案複製操作(例如shutil.copyfile()和shutil.copytree())現在使用特定於平臺的呼叫和其他優化來加速操作。
  • 由於優化利用列表建構函式物件的長度(如果事先已知),現在新建立的列表現在平均比以前小12%。
  • 在Python 3.8中,在新式類(例如,類A(物件))上寫入類變數要快得多。
  • operator.itemgetter()和collections.namedtuple()也有新的速度優化。

Python C API和CPython改進

在Python的最新版本中,主要的工作是重構CPython中使用的C API,這是用C編寫的Python的參考實現。到目前為止,這項工作只產生了增量變化,但它們正在加起來:

  • 用於Python初始化配置的新C API允許對Python的初始化例程進行更嚴格的控制和更詳細的反饋。 這樣可以更輕鬆地將Python執行時嵌入到應用程式中,並以程式設計方式將啟動引數傳遞給Python。 這個新API還旨在確保所有Python的配置控制元件都具有單一,一致的主頁,以便將來更改(如Python的新UTF-8模式)更容易插入。
  • 另一個用於CPython的新C API,即“vectorcall”呼叫協議,允許更快地呼叫內部Python方法,而無需建立臨時物件來處理呼叫。API仍然不穩定,但已暫時可用。 計劃是從Python 3.9開始最終確定它。
  • Python執行時審計掛鉤在Python執行時中提供了兩個API,用於掛鉤事件並使它們可以觀察到外部工具,如測試框架或日誌記錄和審計系統。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913713/viewspace-2648439/,如需轉載,請註明出處,否則將追究法律責任。

相關文章