在考慮學java還是python之前先來說說二者的應用領域。
Python的主要應用方向:
1、科學計算
隨著NumPy,SciPy,Matplotlib,Enthoughtlibrarys等眾多程式庫的開發,Python越來越適合做科學計算、繪製高品質的2D和3D影像。和科學計算領域最受歡迎的商業軟體Matlab相比,Python是一門通用的程式設計語言,比Matlab所採用的腳本語言的應用範圍更廣泛,有更多的程式庫的支援。雖然Matlab中的許多高階功能和toolbox目前還是無法取代的,不過在日常的科學研究開發之中仍有許多的工作是可以用Python代勞的。
2、網路爬蟲
也稱為網路蜘蛛,是大數據產業取得資料的核心工具。沒有網路爬蟲自動地、不分晝夜地、高智慧地在網路上爬取免費的數據,那些大數據相關的公司恐怕要少四分之三。能夠編寫網路爬蟲的程式語言有不少,但Python絕對是其中的主流之一,其Scripy爬蟲框架應用非常廣泛。
3、資料分析
在大量資料的基礎上,結合科學計算、機器學習等技術,將資料清洗、去重、規格化和針對性的分析是大數據產業的基石。 Python是資料分析的主流語言之一。
4、人工智慧
Python在人工智慧大範疇領域內的機器學習、神經網路、深度學習等方面都是主流的程式語言,得到廣泛的支持與應用。
java的主要應用方向:
1、企業級應用程式
這是目前Java應用最廣泛的一個領域,幾乎一枝獨秀。包括各種產業應用,企業資訊化,也包括電子化政府等,領域涉及:辦公室自動化OA,客戶關係管理CRM,人力資源HR,企業資源計畫ERP、知識管理KM、供應鏈管理SCM、企業設備管理系統EAM、產品生命週期管理PLM、服務導向架構SOA、商業智慧BI、專案管理PM、行銷管理、流程管理WorkFlow、財務管理…等幾乎所有你能想到的應用程式。
2、嵌入式設備及消費性電子產品
包括無線手持設備、智慧卡、通訊終端、醫療設備、資訊家電(如數位電視、機上盒、電冰箱)、汽車電子設備等都是近年熱門的Java應用領域,尤其是手機上的Java應用程式和Java遊戲,更是普及。
接下來簡單比較python和java:
靜態語言與動態語言:
靜態語言:
java, c, c , go等
強類型語言(靜態類型語言)是指需要進行變數/物件類型宣告的語言,一般情況下需要編譯執行。強類型語言是一旦變數的類型被確定,就不能轉換的語言。
動態語言:
python, javascript, php, ruby等
弱型別語言(動態類型語言)是指不需要進行變數/物件類型宣告的語言,一般情況下不需要編譯(但也有編譯型的)。動態類型語言是在運行時決定資料類型的語言。變數使用之前不需要型別聲明,通常變數的型別是被賦值的那個值的型別。
弱型別語言則反之,一個變數的型別是由其應用上下文決定的。
靜態語言優勢:
由於類型的強制聲明,使得IDE有很強的程式碼感知能力,故,在實現複雜的業務邏輯、在開發大型商業系統、以及那些生命週期很長的應用中,依托IDE對系統的開發很有保障;
由於靜態語言相對比較封閉,使得第三方開發包對程式碼的侵害性可以降到最低;
動態語言優勢:
在靜態語言中的一些高階概念,如java中的反射以及基於反射實現的AOP, 這些概念對java初學者以及只有一兩年工作經驗的人來說,這幾個概念是很難理解的,更別說如何自己實現。如果大家使用過AOP的話就會明白這幾個概念從理解到熟練使用是比較難的, 而且開發效率會比較低,儘管同學可能會說“其實使用起來還是很簡單啊”, 那可能是因為你沒有用過動態語言中的裝飾者。
動態語言中對於java中的AOP這種概念直接使用裝飾器就可以完成而且是python語言本身的一部分。並不像java還需要引入第三方來完成。
python能輕鬆完成這些正是由於python是一門動態語言, 動態語言的特性使得大家去自己控制整個類別的初始化以及動態去改變物件變的異常簡單, 這些特性使得動態語言的靈活性遠遠超過靜態語言。
解釋型語言和編譯型語言
#這裡的解釋執行是相對於編譯執行而言的。我們都知道,使用C/C 之類的編譯性語言編寫的程序,是需要從源文件轉換成計算機使用的機器語言,經過鏈接器鏈接之後形成了二進制的可執行文件。運行該程式的時候,就可以把二進位程式從硬碟載入到記憶體中並運行。
python的執行過程和Java是類似的:
python解釋器將原始程式碼轉換為字節碼,然後再由python解釋器來執行這些字節碼。
一個具體的python程式執行過程:
- 執行python程式後,將會啟動Python 的解釋器,然後將python程式編譯成一個字節碼物件PyCodeObject。
- 在運行期間,編譯結果也就是PyCodeObject 對象,只會存在於記憶體中,當這個模組的Python 程式碼執行完後,就會將編譯結果儲存到了pyc 檔案中,這樣下次就不用編譯,直接載入記憶體。 pyc 檔案只是 PyCodeObject 物件在硬碟上的表現。
- 這個 PyCodeObject 物件包含了 Python 原始碼中的字串,常數值,以及透過語法解析後編譯產生的字節碼指令。 PyCodeObject 物件也會儲存這些字節碼指令與原始程式碼行號的對應關係,這樣當出現異常時,就能指明位於哪一行的程式碼。
Java也是先編譯成字節碼,再去執行
解釋器,java很特殊,java是需要編譯的,但是沒有直接編譯成機器語言,而是編譯成字節碼,然後在Java虛擬機器上用解釋的方式執行字節碼。 Python也使用了類似的方式,先將python編譯成python字節碼,然後由一個專門的python字節碼解釋器負責解釋執行字節碼。
Python中的GIL
GIL的全名是Global Interpreter Lock(全局解釋器鎖)來源是python設計之初的考慮,為了資料安全所做的決定。
在Python多執行緒下,每個執行緒的執行方式:
1、取得GIL
2、執行程式碼直到sleep或是python虛擬機器將其掛起。
3、釋放GIL
可見,某個執行緒想要執行,必須先拿到GIL,我們可以把GIL看作是“通行證”,並且在一個python進程中,GIL只有一個。拿不到通行證的線程,就不允許進入CPU執行。
而每次釋放GIL鎖定,線程進行鎖定競爭、切換線程,會消耗資源。而由於GIL鎖定存在,python裡一個行程永遠只能同時執行一個執行緒(拿到GIL的執行緒才能執行),這就是為什麼在多核心CPU上,python的多執行緒效率並不高。
每個行程有各自獨立的GIL,互不干擾,這樣就可以真正意義上的並行執行,所以在python中,多進程的執行效率優於多執行緒(僅針對多核心CPU而言)。
由於 GIL 的存在,Python 的多執行緒效能十分低下,無法發揮多核心 CPU 的優勢,效能甚至不如單執行緒。因此如果你想用到多核心 CPU,一個建議是使用多進程或協程。
Python垃圾回收
在講到垃圾回收的時候,通常會使用引用計數的模型,這是一種最直觀,最簡單的垃圾收集技術。 Python 同樣也使用了引用計數,但是引用計數有這些缺點:
1、頻繁更新引用計數會降低運行效率
2、引用計數無法解決循環引用問題
Python 在引用計數機制的基礎上,使用了主流垃圾收集技術中的標記——清除和分代收集兩種技術。
以上內容僅供參考!
推薦Python影片教學:python影片教學
推薦Java影片教學:JAVA影片教學
#以上是已學php再學java還是python?的詳細內容。更多資訊請關注PHP中文網其他相關文章!