? 點擊上方藍字“ Python貓 ”, 免費獲得 一個公眾號
大家好,我是貓哥。我對于編程語言跟其它學科的融合非常感興趣,這種興趣在創辦公眾號時就已非常濃烈,因此,幾個月來,就做了不少大膽的嘗試。不敢說取得了什么“成果”吧,但至少是做到了獨樹一幟。
在這個過程中,我有幸認識了幾位“跨界跨學科”的群友:既有學貫多門語言的大佬,也有深夜研讀斯賓諾莎倫理學的同學,還有逛遍各種展館興趣無邊界的能人。非常有趣。
今天這篇文章的原作者也挺能跨界的,他很佩服毛主席的《矛盾論》,因此把它跟 Python 放在一起思考,寫出了一篇文章來投稿。我欣賞他的 發散思維 ?,以及? 跨學科知識融合 ?的嘗試,于是稍作編輯,發布出來。至于內容,就不多說了,建議你往下一看便知。
?我的戰斗力是53萬 |? 原創作者
?豌豆花下貓 |? 編輯潤色
《矛盾論》是毛主席寫的哲學著作,1975 年由人民出版社出版。
通過閱讀,我發現《矛盾論》中的一些方法論可以應用在編程語言之中,本文以 Python 語言舉例描述。
1.矛盾的普遍性
《矛盾論》原文中有這樣一段話:
列寧也這樣說過矛盾的普遍性:"在數學中,正和負,微分和積分。在力學中,作用和反作用。在物理學中,陽電和陰電。在化學中,原子的化合和分解。在社會科學中,階級斗爭。"戰爭中的攻守,進退,勝敗,都是矛盾的現象。失去一方,他方就不存在。
這段話描述的是矛盾的普遍性。那在 Python 中的矛盾是什么呢?大概就是編寫代碼的速度和代碼運行速度之間的矛盾吧。
請看下面例子,現在有一個任務:在近萬個文件的目錄下,數一數有多少個 JPEG 文件?
看看用各個編程語言實現的情況:

結果顯示 Python 的運行速度明顯慢于 Go 和 Rust,但是,寫這個程序用 Python 需要 15 行代碼,Rust 語言需要 29 行,Go 語言需要 30 行。
(以上例子的出處:https://blog.lilydjwg.me/2018/6/14/walk-a-directory-python-vs-go-vs-rust.212932.html)
這個任務顯示出了 Python 語言中的矛盾:開發速度和運行速度之間的矛盾。
《矛盾論》中關于矛盾有這樣一個描述:
如果是存在兩個以上的矛盾的復雜過程的話,就要用全力找到它的主要矛盾,捉住這個主要矛盾,一切問題就迎刃而解了。
在 Python 中還存在著其它的矛盾,比如內存,并發,可讀性等等,有那么一句笑話“動態語言一時爽,重構代碼火葬場”。
但在 Python 中的主要矛盾就是速度,這一點是被人議論最多的,其它的矛盾也有些是因為速度這個主要矛盾而產生的。
2.為什么會有矛盾?
Python為什么運行速度慢?
首先因為 Python 是動態語言,動態類型語言之所以慢,就是因為每一個簡單的操作都需要大量的指令才能完成。一般來說,虛擬機擁有很強的優化器,但卻是為靜態語言設計的,對 Python 幾乎沒有效果。
舉一個例子。對于整數加法,C 語言很簡單,只要一個機器指令 ADD 就可以了,最多不過再加一些內存讀寫。但是,對于 Python 來說,a + b 這樣的簡單二元運算,可就真的很麻煩了。Python 是動態語言,變量只是對象的引用,變量 a 和 b 本身都沒有類型,而它們的值有類型。所以,在相“加”之前,必須先判斷類型。
其次,Python 的解釋器 CPython 中存在 GIL(全局解釋器鎖),它會讓 Python 只能執行單線程,Python 中所謂的多線程,只是在各個單線程之間的快速切換,讓程序看上去像是在執行多線程。
(對于 Python 慢的分析,這里有篇文章《Python 為什么這么慢?》值得一看,另外, GIL 的問題并不是不可解決的,詳見《GIL 已經被殺死了么? 》)
Python 為什么開發速度快?
首先,也是因為 Python 是動態語言,編程時不用定義變量類型。比如要定義一個變量 a,讓 a 的值為 1,用 C 語言來寫分為兩步,第一步是“int a”,第二步是“a = 1”,另外C語言還需要導入頭文件“#include”和定義主函數 main。而 Python 只需要一步“a = 1”。
其次,Python 擁有大量的模塊、庫和包,讓開發者拿來即用,提高開發效率。
3.矛盾的同一性
“事情不是矛盾雙方互相依存就完了,更重要的,還在于矛盾著的事物的互相轉化。”
《矛盾論》舉了大量例子來說明矛盾的同一性。
比如:”被統治的無產階級經過革命轉化為統治者,原來是統治者的資產階級卻轉化為被統治者,轉化到對方原來所占的地位。”
還有:“大家都知道,戰爭和和平是相互轉化的。戰爭轉化為和平,例如第一次世界大戰轉化為戰后的和平,中國的內戰現在也停止了,出現了國內的和平。和平轉化為戰爭,例如一九二七年的國共合作轉化為戰爭,現在的世界和平局面也可能轉化成第二次世界大戰。“
由此可見,矛盾著的雙方都向著它們的對立面慢慢地轉化。
Python 也是同理。比如想讓 Python 程序運行的快,那可以部分程序用 C/C++ 重寫,那代碼量就會增多,開發速度就會變慢。
運行速度從慢到快,開發速度從快到慢,從相反的方向互相轉化,體現了矛盾的同一性。
4.認識的過程
看一段矛盾論的原文:
就人類認識運動的秩序來說,總是認識個別的和特殊的任務,逐步地擴大到認識一般的事物。人們總是首先認識了許多不同事物的特殊本質,然后才有可能進行更近一步的概括工作,認識諸種事物的特殊本質。
搞編程的人可能多少會聽過一句話“語言是相通的”。一方面,每個編程語言都有自己擅長的領域,比如 Python 適合人工智能,PHP 適合網站開發,Java 適合軟件開發,但每個編程語言又有類似的功能和語法。
前提是你要精通一種語言,了解背后的思想,才可以更好的過渡到其它語言,從而發現各種編程語言的共通之處,從個別到一般。
5.語言的發展
正是由于 Python 存在著“開發快,運行慢”的矛盾,Python 的核心開發團隊才不斷地研究改進,讓 Python 不斷地發展。
毛主席在《矛盾論》中說:
黨內如果沒有矛盾和解決矛盾的思想斗爭,黨的生命也就停止了。
當有一天 Python 中的矛盾消失了,那這門語言也就走到了盡頭,這一點或許也可以映射到其它的編程語言吧。
精選推薦,更多好文
1
為什么 Python 3 ?把 print 改為函數?
2
Python 高速增長的三次歷史機遇
3
Python 工匠:使用裝飾器的技巧
4
你真的知道Python的字符串是什么嗎?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
