点击上方蓝字“ 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的字符串是什么吗?