1. 程式人生 > >關於python優缺點的思考

關於python優缺點的思考

    由於工作原因,目前我接觸最多的,理解最深的語言是python,雖然接觸的時間沒有C,Pascal來得長,但是由於工作的需要,對這個語言進行了一些探索,現在想談談我有關與python的看法,當然,我接觸過的語言並不多,而且都沒有怎麼深入地接觸,所以部分見解可能會有一定的偏差,還望讀者糾正或補充。

    python的優點主要集中在以下幾個方面,這也是這些年python逐漸從茫茫多的語言市場中脫穎而出的原因:

    1.簡潔易懂:

    程式設計者接觸某一種語言,一般不可能從底層開始瞭解,就像大學裡計科系會在第一學期開C語言,而不是第一學期開組合語言,計算機組成原理,編譯原理這些比較深入的課程,C語言是建立在前面幾門學問之上的沒錯,但是作為高階語言,它顯然更貼近生活,能讓零基礎的人更快上手,計算機相關的教育,都是這樣自頂向下的過程(當然你一定要說數學是計算機的基礎,從小學開始學數學是自底向上,那我也無法反駁),總之,高階語言作為很多人接觸計算機這門學問的第一步,相當於整個軟體行業的臉面,自然不能生得組成原理,作業系統這樣生澀堅晦的”凶惡“面孔,所以高階語言的上手難度直接決定了它的在人力市場中的受歡迎程度

    python就是這樣一種”面色慈愛“的高階語言,或許對於一箇中國人而言,python和其他語言一樣都是一堆英文字母,但是從外國人的角度看,寫python就像是寫作一樣順暢自然,同樣,即使對於不以英語為母語的國家,python也以關鍵字少,結構簡單,語法清晰讓初學者迅速上手,我記得我入職的時候,從python零基礎開始,一週左右就可以順暢地實現掃雷,俄羅斯方塊這類簡單的遊戲邏輯了,而同樣的情況在我剛剛大一的時候,我刷了一個月的HUD才比較順暢地從高中的Pascal轉到C,除了對部分尚未熟悉OOP(面向物件程式設計)的新手可能會有一定的理解難度,python其他的地方學習起來基本上不會有太大的阻力

    而且python的程式碼格式很好,這個和python將縮排作為語法辨識的其中一部分有直接的關係(當然,一定要不按照這個規則來也是可以的,用“;”連線不同行的程式碼,然後將程式碼拼成佛祖的形狀企圖反彈一切bug,但是大部分正常人不會這麼做的,不是嗎?)由於約定採用縮排作為程式碼分段的判斷依據,一來規範了所有人的程式碼格式,二來減少了分號,括號這類的使用,這樣使用者就不用將注意力放在這些隨時跟在程式碼頭尾,千篇一律的字元

    2.跨平臺

python本質上是用C寫的(我知道有Java寫的python,不過那可以稱之為Jython),所以,一切有C編譯器的地方,就等於有python直譯器,python和C的關係有點類似於銀票和銀子的關係,一切可以用銀子的地方,一般也適用於銀票,因為銀票本身就是銀子的代表,銀票的信譽基於銀子作為一般等價物的信譽,這同樣適用於python,而C作為一種橫行天下數十載的大佬,自然早就有了大量適配的平臺,這也為python的成長打下了基礎

    3.可擴充套件性

曾經我問過一位前輩:為什麼python沒有抽象類,沒有其他語言裡那些privity,public,protect這些設定,就連python定義內建方法的__字首也很少看到在專案程式碼中使用,前輩告訴我,python這樣做是為了自由,而專案組不用__是一種約定

    後一條是為了專案組內的統一,暫時不討論,畢竟最好的規範就是統一的規範

    那麼python之所以沒有私有,公有,抽象這些東西,完全是出於一種自由的設計思想,事實上在python中實現私有,公有,抽象這些東西並不是做不到的,只需要自己封裝一些東西就行了,比如抽象類,只需要讓所有預設介面raise異常即可,這個類就從意義上成為了抽象類,同理,私有,公有也可以自己去實現,python沒有在底層預設寫好,就是出於一種自由的設計思想,雖然抽象類的適用範圍很廣,但是誰也不能打包票說任何地方都是有抽象類比沒有抽象類更好,於是python就將有沒有抽象類的選擇留給了使用者。

    當然,這只是python內在的一個細節,實際上python的可擴充套件性不僅僅在對內的設計思想上,它對外也是如此,這裡的對外即不同語言之間的配合使用,用我身邊的例子來說,遊戲的服務端可以用C作為底層遊戲引擎,python作為邏輯指令碼,就像是呼叫自己親兒子一樣呼叫C編寫的引擎介面,除了跳轉不進去之外(可以用文件填補),其他渾然天成,彷彿C語言的底層不存在一樣。

說完了優點,自然要講一講缺點了,python的缺點自然很明顯:

    1.效率

動態語言的硬傷自然就是慢,比Java還慢,和C相比差距大概在五倍左右,大規模計算差距超過10倍

    這也是python最大的一個問題,有得必有失,python的效率問題也不是技術原因導致的,而且python也對這方面有所彌補,那就是對效率敏感的地方可以用C重寫,以達到預期的效率需求,但是治標不治本,追求python的高開發效率的同時,就得捨棄一些效能上的追求。

    2.GIL

    這是屬於python的一個歷史遺留問題,當然我所接觸的遊戲服務端設計刻意避開了多執行緒的問題,在程式碼中儘量避開了這一個尷尬的部分(當然據大佬說,多執行緒容易出錯,不好管理),雖然有世界服這種多程序的伺服器設計思路,但是大部分維持資料同步的手段都是在腳本里寫的,而不是python語言自身實現的

    有關與GIL相關的討論,可以參考這裡:

    當然,目前我對python的理解或許還不足以支撐起一篇深度探討python的文章,不過我會持續更新這篇文章,將自己的理解和想法放進來,也希望大家能夠在評論中分享自己對python的看法,互相提高