本文目錄一覽:
北大青鳥設計培訓:python編程開發關於程序擴展操作?
隨著互聯網的不斷發展,我們對python編程開發技術的學習和掌握程度也在不斷的提高。
下面我們就通過案例分析來了解和學習一下,關於程序擴展都有哪些操作方法。
必要的概念傳統編程依賴於兩個核心概念:函數和類。
使用這些構建塊就可以構建出無數的應用程序。
但是,當我們將應用程序遷移到分散式環境時,這些概念通常會發生變化。
一方面,OpenMPI、Python多進程和ZeroMQ等工具提供了用於發送和接收消息的低級原語。
這些工具非常強大,但它們提供了不同的抽象,因此要使用它們就必須從頭開始重寫單線程應用程序。
另一方面,我們也有一些特定領域的工具,例如用於模型訓練的TensorFlow、用於數據處理且支持SQL的Spark,以及用於流式處理的Flink。
這些工具提供了更高級別的抽象,如神經網路、數據集和流。
但是,因為它們與用於串列編程的抽象不同,所以要使用它們也必須從頭開始重寫應用程序。
用於分散式計算的工具Ray佔據了一個獨特的中間地帶。
它並沒有引入新的概念,而是採用了函數和類的概念,並將它們轉換為分散式的任務和actor。
Ray可以在不做出重大修改的情況下對串列應用程序進行並行化。
開始使用Rayray.init()命令將啟動所有相關的Ray進程。
在切換到集群時,這是需要更改的行(我們需要傳入集群地址)。
java課程培訓機構發現這些過程包括:有很多worker進程並行執行Python函數(大概是每個CPU核心對應一個worker)。
用於將「任務」分配給worker(以及其他計算機)的調度程序進程。
任務是Ray調度的工作單元,對應於一個函數調用或方法調用。
Python為什麼能擴展
Python 具有高可擴展性,存在許多使用 C 語言或 Fortran 編寫擴展的方法。必要時,Python 代碼可以直接將這些擴展作為子常式來調用。這部分討論用於構建擴展的一些主要編譯器(絕對不是完整列表)。
相關推薦:《Python基礎教程》
Cython
Cython(不同於 CPython)既是指一種語言,也是指一種編譯器。Cython 語言是添加了 C 語言語法的 Python 語言的超集。Cython 可以在代碼段或完整函數中顯式釋放 GIL。變數和類屬性上的 C 類型聲明以及對 C 函數的調用都使用 C 語法。其餘部分代碼則使用 Python 語法。通過這個混合的 Cython 代碼,Cython 編譯器可生成高效的 C 代碼。任何定期優化的 C/C++ 編譯器都可以編譯此 C 代碼,從而高度優化擴展的運行時代碼,性能接近於原生的 C 代碼性能。
Numba
Numba 是一個動態、即時 (JIT) 且可感知 NumPy 的 Python 編譯器。Numba 使用 LLVM 編譯器基礎架構,生成優化的機器代碼和從 Python 調用代碼的包裝器。與 Cython 不同,編碼使用常規的 Python 語言。Numba 可讀取來自裝飾器中所嵌入注釋的類型信息,並優化代碼。對於使用 NumPy 數據結構的程序,比如數組以及許多數學函數,它可以實現與 C 或 Fortran 語言類似的性能。NumPy 對線性代數和矩陣函數使用硬體加速,利用 LAPACK 和 BLAS 提供額外加速,大大提升了性能,參見 IBM 博客文章C、Julia、Python、Numba 和 Cython 在 LU 因式分解方面的速度比較。
除 CPU 以外,Numba 還能夠使用 GP-GPU 後端。Anaconda, Inc. 是 Python 某個主要發行版的幕後公司,該公司還開發了 Numba 和商業版的 Numba Pro。
Fortran to Python Interface Generator
Fortran to Python Interface Generator (F2Py) 起初為一個獨立的程序包,現在包含在 NumPy 中。F2Py 支持 Python 調用以 Fortran 編寫的數值常式,就好像它們是另一個 Python 模塊一樣。因為 Python 解釋器無法理解 Fortran 源代碼,所以 F2Py 以動態庫文件格式將 Fortran 編譯為本機代碼,這是一種共享對象,包含具有 Python 模塊介面的函數。因此,Python 可以直接將這些函數作為子常式來調用,以原生 Fortran 代碼的速度和性能來執行。
python 可擴展主要體現?
就算你的項目中有大量的Python代碼,你也依舊可以有條不紊地通過將其分離為多個文件或模塊加以組織管理。而且你可以從一個模塊中選取代碼,而從另一個模塊中讀取屬性。更棒的是,對於所有模塊,Python的訪問語法都是相同的。不管這個模塊是Python標準庫中的還是你一分鐘之前創造的,哪怕是你用其他語言寫的擴展都沒問題!藉助這些特點,你會感覺自己根據需要「擴展」了這門語言,而且你已經這麼做了。
代碼中的瓶頸,可能是在性能分析中總排在前面的那些熱門或者一些特彆強調性能的地方,可以作為Python擴展用C重寫。需要重申的是,這些介面和純Python模塊的介面是一模一樣的,乃至代碼和對象的訪問方法也是如出一轍的。唯一不同的是,這些代碼為性能帶來了顯著的提升。自然,這全部取決你的應用程序以及它對資源的需求情況。很多時候,使用編譯型代碼重寫程序的瓶頸部分絕對是益處多多的,因為它能明顯提升整體性能。
程序設計語言中的這種可擴展性使得工程師能夠靈活附加或定製工具,縮短開發周期。雖然像C、C++乃至Java等主流第三代語言(3GL)都擁有該特性,但是這麼容易地使用C編寫擴展確實是Python的優勢。此外,還有像PyRex這樣的工具,允許C和Python混合編程,使編寫擴展更加輕而易舉,因為它會把所有的代碼都轉換成C語言代碼。
因為Python的標準實現是使用C語言完成的(也就是CPython),所以要使用C和C++編寫Python擴展。Python 的Java實現被稱作Jython,要使用Java編寫其擴展。最後,還有IronPython,這是針對.NET或Mono平台的C#實現。你可以使用C#或者VB.Net擴展IronPython.
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/277659.html