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

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

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