前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用《矛盾论》来解读 Python

用《矛盾论》来解读 Python

作者头像
Python猫
发布2019-06-24 20:43:32
5510
发布2019-06-24 20:43:32
举报
文章被收录于专栏:Python无止境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 中的矛盾消失了,那这门语言也就走到了尽头,这一点或许也可以映射到其它的编程语言吧。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python猫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.矛盾的普遍性
  • 2.为什么会有矛盾?
  • 3.矛盾的同一性
  • 4.认识的过程
  • 5.语言的发展
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档