用《矛盾论》来解读 Python

系统 1363 0

  点击上方蓝字“ Python猫 ”, 免费获得 一个公众号

大家好,我是猫哥。我对于编程语言跟其它学科的融合非常感兴趣,这种兴趣在创办公众号时就已非常浓烈,因此,几个月来,就做了不少大胆的尝试。不敢说取得了什么“成果”吧,但至少是做到了独树一帜。

在这个过程中,我有幸认识了几位“跨界跨学科”的群友:既有学贯多门语言的大佬,也有深夜研读斯宾诺莎伦理学的同学,还有逛遍各种展馆兴趣无边界的能人。非常有趣。

今天这篇文章的原作者也挺能跨界的,他很佩服毛主席的《矛盾论》,因此把它跟 Python 放在一起思考,写出了一篇文章来投稿。我欣赏他的 发散思维  ,以及  跨学科知识融合  的尝试,于是稍作编辑,发布出来。至于内容,就不多说了,建议你往下一看便知。

用《矛盾论》来解读 Python_第1张图片

 我的战斗力是53万 |  原创作者

 豌豆花下猫 |  编辑润色

《矛盾论》是毛主席写的哲学著作,1975 年由人民出版社出版。

通过阅读,我发现《矛盾论》中的一些方法论可以应用在编程语言之中,本文以 Python 语言举例描述。

1.矛盾的普遍性

《矛盾论》原文中有这样一段话:

列宁也这样说过矛盾的普遍性:"在数学中,正和负,微分和积分。在力学中,作用和反作用。在物理学中,阳电和阴电。在化学中,原子的化合和分解。在社会科学中,阶级斗争。"战争中的攻守,进退,胜败,都是矛盾的现象。失去一方,他方就不存在。

这段话描述的是矛盾的普遍性。那在 Python 中的矛盾是什么呢?大概就是编写代码的速度和代码运行速度之间的矛盾吧。

请看下面例子,现在有一个任务:在近万个文件的目录下,数一数有多少个 JPEG 文件?

看看用各个编程语言实现的情况:

用《矛盾论》来解读 Python_第2张图片

结果显示 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的字符串是什么吗?

用《矛盾论》来解读 Python_第3张图片


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论