scala簡(jiǎn)介
Scala是一門多范式的編程語(yǔ)言,一種類似java的編程語(yǔ)言,設(shè)計(jì)初衷是實(shí)現(xiàn)可伸縮的語(yǔ)言、并集成面向?qū)ο缶幊毯秃瘮?shù)式編程的各種特性。
scala的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
Scala = haskell (for,yield = do notation)+ ocaml((object + trait)實(shí)現(xiàn)module system,這里注意是trait而不是object 關(guān)鍵詞 實(shí)現(xiàn)first class module。如果再加上Path depentent type 就更強(qiáng)大了) + object oriented(函數(shù)也被當(dāng)作Object) + 、、,是一門非常復(fù)雜的語(yǔ)言,但同時(shí)也是最實(shí)用的函數(shù)式語(yǔ)言,生態(tài)很豐富,web 有play,akka-http,數(shù)據(jù)庫(kù)有Slick(為Sql數(shù)據(jù)庫(kù)提供了極端簡(jiǎn)潔的使用方式),深度學(xué)習(xí)可以直接調(diào)java 的dl4j,還能通過(guò)scalajs編譯到JS。scala 其實(shí)是很純的面向?qū)ο笳Z(yǔ)言(函數(shù)也是object),確還能當(dāng)成函數(shù)式語(yǔ)言使用,不得不贊賞其精妙!
缺點(diǎn):
特性太多學(xué)習(xí)曲線很陡峭,主要是加入了Subtyping、path dependent type 等造成類型系統(tǒng)復(fù)雜,而語(yǔ)法其實(shí)不算復(fù)雜。還有就是類型系統(tǒng)Unsound(不清楚這個(gè)有什么影響),類型推導(dǎo)不如Haskell的HM 類型系統(tǒng),加類型標(biāo)記的時(shí)候比HM type system 多
python簡(jiǎn)介
Python 是一個(gè)高層次的結(jié)合了解釋性、編譯性、互動(dòng)性和面向?qū)ο蟮哪_本語(yǔ)言。Python 的設(shè)計(jì)具有很強(qiáng)的可讀性,相比其他語(yǔ)言經(jīng)常使用英文關(guān)鍵字,其他語(yǔ)言的一些標(biāo)點(diǎn)符號(hào),它具有比其他語(yǔ)言更有特色語(yǔ)法結(jié)構(gòu)。
python的優(yōu)缺點(diǎn)
python語(yǔ)言的優(yōu)點(diǎn)
1、作為初學(xué)python的科班出身的小白,python非常簡(jiǎn)單,非常適合人類閱讀。閱讀一個(gè)良好的Python程序就感覺(jué)像是在讀英語(yǔ)一樣,盡管這個(gè)英語(yǔ)的要求非常嚴(yán)格!Python的這種偽代碼本質(zhì)是它最大的優(yōu)點(diǎn)之一。它使你能夠?qū)W⒂诮鉀Q問(wèn)題而不是去搞明白語(yǔ)言本身。
2、易學(xué)。python雖然是用c語(yǔ)言寫的,但是它擯棄了c中非常復(fù)雜的指針,簡(jiǎn)化了python的語(yǔ)法。
3、Python是FLOSS(自由/開放源碼軟件)之一。簡(jiǎn)單地說(shuō),你可以自由地發(fā)布這個(gè)軟件的拷貝、閱讀它的源代碼、對(duì)它做改動(dòng)、把它的一部分用于新的自由軟件中。Python希望看到一個(gè)更加優(yōu)秀的人創(chuàng)造并經(jīng)常改進(jìn)。
4、可移植性————由于它的開源本質(zhì),Python已經(jīng)被移植在許多平臺(tái)上(經(jīng)過(guò)改動(dòng)使它能夠工作在不同平臺(tái)上)。如果你小心地避免使用依賴于系統(tǒng)的特性,那么你的所有Python程序無(wú)需修改就可以在下述任何平臺(tái)上面運(yùn)行。這些平臺(tái)包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至還有PocketPC、Symbian以及Google基于linux開發(fā)的Android平臺(tái)!
5、在計(jì)算機(jī)內(nèi)部,Python解釋器把源代碼轉(zhuǎn)換成稱為字節(jié)碼的中間形式,然后再把它翻譯成計(jì)算機(jī)使用的機(jī)器語(yǔ)言并運(yùn)行。事實(shí)上,由于你不再需要擔(dān)心如何編譯程序,如何確保連接轉(zhuǎn)載正確的庫(kù)等等,所有這一切使得使用Python更加簡(jiǎn)單。由于你只需要把你的Python程序拷貝到另外一臺(tái)計(jì)算機(jī)上,它就可以工作了,這也使得你的Python程序更加易于移植。
6、Python既支持面向過(guò)程的函數(shù)編程也支持面向?qū)ο蟮某橄缶幊?。在面向過(guò)程的語(yǔ)言中,程序是由過(guò)程或僅僅是可重用代碼的函數(shù)構(gòu)建起來(lái)的。在面向?qū)ο蟮恼Z(yǔ)言中,程序是由數(shù)據(jù)和功能組合而成的對(duì)象構(gòu)建起來(lái)的。與其他主要的語(yǔ)言如C++和Java相比,Python以一種非常強(qiáng)大又簡(jiǎn)單的方式實(shí)現(xiàn)面向?qū)ο缶幊獭?/p>
7、可擴(kuò)展性和可嵌入性。如果你需要你的一段關(guān)鍵代碼運(yùn)行得更快或者希望某些算法不公開,你可以把你的部分程序用C或C++編寫,然后在你的Python程序中使用它們。你可以把Python嵌入你的C/C++程序,從而向你的程序用戶提供腳本功能。
8、豐富的庫(kù)。Python標(biāo)準(zhǔn)庫(kù)確實(shí)很龐大。python有可定義的第三方庫(kù)可以使用。它可以幫助你處理各種工作,包括正則表達(dá)式、文檔生成、單元測(cè)試、線程、數(shù)據(jù)庫(kù)、網(wǎng)頁(yè)瀏覽器、CGI、FTP、電子郵件、XML、XML-RPC、HTML、WAV文件、密碼系統(tǒng)、GUI(圖形用戶界面)、Tk和其他與系統(tǒng)有關(guān)的操作。記住,只要安裝了Python,所有這些功能都是可用的。這被稱作Python的“功能齊全”理念。除了標(biāo)準(zhǔn)庫(kù)以外,還有許多其他高質(zhì)量的庫(kù),如wxPython、Twisted和Python圖像庫(kù)等等。
9、Python確實(shí)是一種十分精彩又強(qiáng)大的語(yǔ)言。它合理地結(jié)合了高性能與使得編寫程序簡(jiǎn)單有趣的特色。
10、規(guī)范的代碼。Python采用強(qiáng)制縮進(jìn)的方式使得代碼具有極佳的可讀性。
python語(yǔ)言的缺點(diǎn)
很多時(shí)候不能將程序連寫成一行,如import sys;for i in sys.path:print i。而perl和awk就無(wú)此限制,可以較為方便的在shell下完成簡(jiǎn)單程序,不需要如Python一樣,必須將程序?qū)懭胍粋€(gè).py文件。(對(duì)很多用戶而言這也不算是限制)
⑴運(yùn)行速度,有速度要求的話,用C++改寫關(guān)鍵部分吧。不過(guò)對(duì)于用戶而言,機(jī)器上運(yùn)行速度是可以忽略的。因?yàn)橛脩舾靖杏X(jué)不出來(lái)這種速度的差異。
⑵既是優(yōu)點(diǎn)也是缺點(diǎn),python的開源性是的Python語(yǔ)言不能加密,但是目前國(guó)內(nèi)市場(chǎng)純粹靠編寫軟件賣給客戶的越來(lái)越少,網(wǎng)站和移動(dòng)應(yīng)用不需要給客戶源代碼,所以這個(gè)問(wèn)題就是問(wèn)題了。國(guó)隨著時(shí)間的推移,很多國(guó)內(nèi)軟件公司,尤其是游戲公司,也開始規(guī)模使用他。
⑶ 構(gòu)架選擇太多(沒(méi)有像C#這樣的官方.net構(gòu)架,也沒(méi)有像ruby由于歷史較短,構(gòu)架開發(fā)的相對(duì)集中。Ruby on Rails 構(gòu)架開發(fā)中小型web程序天下無(wú)敵)。不過(guò)這也從另一個(gè)側(cè)面說(shuō)明,python比較優(yōu)秀,吸引的人才多,項(xiàng)目也多。
scala和python對(duì)比分析哪個(gè)好
scala和python到底哪個(gè)更好呢?接下來(lái)小編基于Spark環(huán)境詳細(xì)的對(duì)比分析一下這兩種語(yǔ)言,哪款更好一看便知。
1、性能對(duì)比
由于Scala是基于JVM的數(shù)據(jù)分析和處理,Scala比Python快10倍。當(dāng)編寫Python代碼用且調(diào)用Spark庫(kù)時(shí),性能是平庸的,但如果程序涉及到比Python編碼還要多的處理時(shí),則要比Scala等效代碼慢得多。Python解釋器PyPy內(nèi)置一個(gè)JIT(及時(shí))編譯器,它很快,但它不提供各種Python C擴(kuò)展支持。在這樣的情況下,對(duì)庫(kù)的C擴(kuò)展CPython解釋器優(yōu)于PyPy解釋器。
使用Python在Spark的性能開銷超過(guò)Scala,但其重要性取決于您在做什么。當(dāng)內(nèi)核數(shù)量較少時(shí),Scala比Python快。隨著核數(shù)的增加,Scala的性能優(yōu)勢(shì)開始縮小。
當(dāng)大量的處理其工作時(shí),性能不是選擇編程語(yǔ)言的主要驅(qū)動(dòng)因素。然而,當(dāng)有重要的處理邏輯時(shí),性能是一個(gè)主要因素,Scala絕對(duì)比Python提供更好的性能,用于針對(duì)Spark程序。
2、學(xué)習(xí)曲線
在用Scala語(yǔ)言編寫Spark程序時(shí)有幾個(gè)語(yǔ)法糖,所以大數(shù)據(jù)專業(yè)人員在學(xué)習(xí)Spark時(shí)需要非常小心。程序員可能會(huì)發(fā)現(xiàn)Scala語(yǔ)法有時(shí)會(huì)讓人發(fā)瘋。Scala中的一些庫(kù)很難定義隨機(jī)的符號(hào)運(yùn)算符,而這些代碼可以由沒(méi)有經(jīng)驗(yàn)的程序員理解。在使用Scala時(shí),開發(fā)人員需要關(guān)注代碼的可讀性。與Scala相比,Java或Python是一個(gè)靈活的語(yǔ)法復(fù)雜的語(yǔ)言。對(duì)Scala開發(fā)人員的需求越來(lái)越大,因?yàn)榇髷?shù)據(jù)公司重視能在Spark中掌握數(shù)據(jù)分析和處理的高效而健壯的開發(fā)人員。
Python是為Java程序員學(xué)習(xí)相對(duì)容易的因?yàn)樗恼Z(yǔ)法和標(biāo)準(zhǔn)庫(kù)。然而,Python是不是一個(gè)高度并行和可擴(kuò)展的像SoundCloud或推特系統(tǒng)的理想選擇。
學(xué)習(xí)Scala豐富了程序員對(duì)類型系統(tǒng)中各種新抽象的認(rèn)識(shí),新的函數(shù)編程特性和不可變數(shù)據(jù)。
3、并發(fā)性
大數(shù)據(jù)系統(tǒng)的復(fù)雜多樣的基礎(chǔ)結(jié)構(gòu)需要一種編程語(yǔ)言,它有能力集成多個(gè)數(shù)據(jù)庫(kù)和服務(wù)。在大數(shù)據(jù)的生態(tài)系統(tǒng)中,Scala勝在Play框架提供了許多異步庫(kù)和容易集成的各種并發(fā)原語(yǔ),比如Akka。Scala使開發(fā)人員編寫高效的、可讀性和可維護(hù)性的服務(wù)而不是。相反,Python不支持的重量級(jí)進(jìn)程并行在用uWSGI時(shí),但它不支持真正的多線程。
當(dāng)使用Python寫Spark程序時(shí),不管進(jìn)程有多少線程,每次只有一個(gè)CPU在Python進(jìn)程中處于活動(dòng)狀態(tài)。這有助于每個(gè)CPU核心只處理一個(gè)進(jìn)程,但糟糕的是,每當(dāng)部署新代碼時(shí),需要重新啟動(dòng)更多的進(jìn)程,還需要額外的內(nèi)存開銷。Scala在這些方面更高效,更容易共事。
4、類型安全
當(dāng)用Spark編程時(shí),開發(fā)人員需要根據(jù)變化的需求不斷地重新編碼代碼。Scala是靜態(tài)類型語(yǔ)言,盡管它看起來(lái)像一種動(dòng)態(tài)類型語(yǔ)言,因?yàn)樗哂袃?yōu)雅的類型推斷機(jī)制。作為靜態(tài)類型語(yǔ)言,Scala仍然提供編譯器來(lái)捕獲編譯時(shí)錯(cuò)誤。
重構(gòu)像Scala這樣的靜態(tài)類型語(yǔ)言的程序代碼比重構(gòu)像Python這樣的動(dòng)態(tài)語(yǔ)言代碼要容易得多且簡(jiǎn)單。開發(fā)人員在修改Python程序代碼后常常會(huì)遇到困難,因?yàn)樗斐傻腷ug比修復(fù)程序原有的bug要多。所以最好是緩慢而安全地使用Scala,而不是快速的、死地使用Python。
對(duì)于小型的特殊實(shí)驗(yàn),Python是一種有效的選擇,但它并不像靜態(tài)語(yǔ)言那樣有效地?cái)U(kuò)展到大型軟件工程中。
5、易用性
Scala和Python語(yǔ)言在Sparkcontext中有同樣的表達(dá),因此通過(guò)使用Scala或Python可以實(shí)現(xiàn)所需的功能。無(wú)論哪種方式,程序員都會(huì)創(chuàng)建一個(gè)Sparkcontext并調(diào)用函數(shù)。Python是一種比Scala更便于用戶使用的語(yǔ)言。Python不那么冗長(zhǎng),開發(fā)人員很容易用Python編寫腳本來(lái)調(diào)用Spark。易用性是一個(gè)主觀因素,因?yàn)樗Q于程序員的個(gè)人偏好。
6、高級(jí)特性
Scala編程語(yǔ)言有幾個(gè)存在類型、宏和隱式。Scala的晦澀難懂的語(yǔ)法可能很難對(duì)開發(fā)人員可能無(wú)法理解的高級(jí)特性進(jìn)行實(shí)驗(yàn)。然而,Scala的優(yōu)勢(shì)在于在重要的框架和庫(kù)中使用這些強(qiáng)大的特性。
話雖如此,Scala沒(méi)有足夠的數(shù)據(jù)科學(xué)工具和庫(kù),如Python用于機(jī)器學(xué)習(xí)和自然語(yǔ)言處理。Sparkmlib–機(jī)器學(xué)習(xí)庫(kù)只有較少的ML算法但他們是理想的大數(shù)據(jù)處理。Scala缺乏良好的可視化和本地?cái)?shù)據(jù)轉(zhuǎn)換。Scala無(wú)疑是Spark streaming特性的最佳選擇,因?yàn)镻ython 通過(guò)pySpark 調(diào)用Spark.streaming不像Scala那樣先進(jìn)和成熟。
總結(jié)
“Scala速度更快,使用方便 但上手難,而Python則較慢,但很容易使用?!?/p>
Spark框架是用Scala編寫的,所以了解Scala編程語(yǔ)言有助于大數(shù)據(jù)開發(fā)人員輕松地挖掘源代碼,如果某些功能不能像預(yù)期的那樣發(fā)揮作用。使用Python增加了更多問(wèn)題和bug的可能性,因?yàn)?種不同語(yǔ)言之間的轉(zhuǎn)換是困難的。為Spark使用Scala提供對(duì)Spark框架的最新特性的訪問(wèn),因?yàn)樗鼈兪紫仍赟cala中可用,然后移植到Python中。
根據(jù)Spark決定Scala和Python取決于最適合項(xiàng)目需要的特性,因?yàn)槊糠N語(yǔ)言都有自己的優(yōu)點(diǎn)和缺點(diǎn)。在使用Apache Spark編程語(yǔ)言之前,開發(fā)者必須學(xué)習(xí)Scala和Python來(lái)熟悉它們的特性。學(xué)習(xí)了Python和Scala之后,決定何時(shí)使用Scala來(lái)Spark以及何時(shí)使用Python來(lái)調(diào)用Spark是相當(dāng)容易的。Apache Spark編程語(yǔ)言的選擇完全取決于要解決的問(wèn)題。
-
python
+關(guān)注
關(guān)注
56文章
4792瀏覽量
84627 -
scala
+關(guān)注
關(guān)注
0文章
42瀏覽量
6417
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論