当前位置: 首页 > 编程日记 > 正文

Go对Python产生的冲击

作者 | yuliao

来源 | 懒编程(ID: hackpython)

Go 的流行让以 Python 为主流语言的开发者(比如我)产生了一定的危机感。上一次有这种危机感还是做 Android 开发的时候,当时用 Java 做 Android 开发,Google 强推 Kotlin 让我有比较强的危机感,加了很多 Android 开发者交流群,大家都说工作难找,后来我就转 Python 了。

就目前观察而言,Python 的流行不会那么快的衰减,很多非开发人员会以 Python 作为首门编程语言来学习,Python 简单上手的特点在这里发挥出巨大的优势,但了解的越深会体会到 Python 在工程方面的乏力,一个很具体的例子就是 Web 方面,虽然最近出现了测试覆盖率 100% 的 FastApi 框架,但整体形势依旧不太乐观。

Python 的异步机制一直让人诟病,听过多位资深 Python 开发者吐槽 Python 在 asyncio 上存在的问题,就我了解而言,很少有公司会在生成环境使用 asyncio,太多迷惑行为以及限制了,目前生产环境要用异步,依旧首选 gevent,多年的东西,更新也不是特别频繁,依旧是现在的首选,从这点也可以看出 Python 在异步方面很不给力。

Python 还有很多缺陷,这里不再多费笔墨,但一个事实是,「每个编程语言深入后,都可以提出很多缺陷」,但比较让人悲观的是 Python 社区的运作方式,其松散的运作方式让很多重要却具有较大难度的功能难以被推进与实现。当然,我个人能力有限,在社区也无丝毫贡献,所以也无话可说。

虽然吐槽了 Python,但 Python 还是一门值得学习的编程语言,特别是作为非技术人员的首门语言。

回到本文的主题。

  • 为什么 Go 对 Python 产生了冲击?

  • 为什么很多公司开始从 Python 转 Go?

  • 为什么 Java 对 Python 造成不了这么大的威胁?

先回答第三个问题,虽然 Java 比 Python 快上不少,但在「多技术联动的时代,这种差距的影响在缩小」,而 Python 在开发效率上比 Java 高出不少,让更多人倾向于选择 Python。

假设 Java 比 Python 快 10 倍,执行相同逻辑 Java 需要 1ms,而 Python 需要 10ms,差距似乎很大啊,但一个项目通常不会只使用编程语言完成逻辑操作,比如数据库使用 MySQL,数据库操作可能要花费 60ms,那么相同的逻辑,Java 项目需要 61ms,而 Python 项目需要 70ms,此时相差 9ms,注意这 9ms 的速度落差对于整体项目时间的比重并不大,可以说编程语言速度上的差距会因为一个项目中使用多种不同的工具而降低影响。

另一个原因是,选择 Java 通常是开发大型 Web 项目,此时会从架构、易维护、易读等不同角度考虑,这并不是 Python web 开发的主战场,中小型 Web 项目才是。

综上所述,Java 对 Python 的冲击并不大。

为何 Go 会产生这么大的冲击呢?

Go 的运行速度确实比 Python 快很多,但核心原因却是 Go 语言上手难度低、开发效率高,使用 Go 开发一个 Web 系统是很快的,语言层面支持异步,让初学者不必了解太多技巧,循规蹈矩的开发就可以获得一个性能不错的 Web 系统。

在早几年,Go 的周边工具链还不完善,所以影响没那么大,但经过今年发展,Go 已经全方位跟上了 Python 的步伐,从这点也可以看出,一个开源项目的背后有个商业公司的益处,对项目会有较强的推动性。

在 Web 领域,Python 在 Go 面前几乎没啥优势...

为什么很多公司要从 Python 转 Go?

Go 的众多优势是一个明显的原因。

此外很多公司的项目因为历史原因,还是使用 Python2.7 开发的,2020 年,Python 官方宣布停止对 Python2.7 的支持,让很多公司不得不考虑升级成 Python3,尴尬的是,Python3 并没有向后兼容 Python2,所以升级会存在风险,此时 Go 风头正盛,简单易用性能好的特性越发深入人心,这就产生了「升级 Python3 还不如使用 Go 重写的想法」。

注意,上述讨论都是针对于 Web 领域,而 Python 在数据分析与机器学习等领域依旧是一流语言,但遗憾的是,这几个领域并不太依赖于 Python 多样化的语法糖,而更侧重该领域特有的一些知识,如数学、统计学等等。

至此,结论已经很明显了,如果你想找 Web 方面的工作岗位,我建议你学习 Go。

【end】◆精彩推荐◆2020 AI 开发者万人大会将于6月26日通过线上直播形式,让开发者们一站式学习了解当下 AI 的前沿技术研究、核心技术与应用以及企业案例的实践经验,同时还可以在线参加精彩多样的开发者沙龙与编程项目。参与前瞻系列活动、在线直播互动,不仅可以与上万名开发者们一起交流,还有机会赢取直播专属好礼,与技术大咖连麦。今日福利:评论区留言入选,都可获得价值299元的「2020 AI开发者万人大会」在线直播门票一张。快来动动手指,写下你想说的话吧~你也可以点击阅读原文,查看活动详情。
推荐阅读百万人学AI:CSDN重磅共建人工智能技术新生态对标Pytorch,清华团队推出自研AI框架“计图”医疗保健、零售、金融、制造业……一文带你看懂大数据对工业领域的影响!如何开发日均吸引100万活跃用户的DApp?先收藏再看!Kubernetes这么火你还不知道是啥?赶紧来看看吧~微信iOS版正式支持深色模式;谷歌宣布彻底取消I/O开发者大会;Visual Studio 2019 16.5发布
你点的每个“在看”,我都认真当成了AI

相关文章:

更新ADT到Android L的方法

android ADT无法更新到20? 哈哈,有办法,windows 进入host 写入例如以下所有,是的所有。然后在到sdk manager中方可更新 #Google Services START #Googleapis↓ 61.19.1.54 mt0.googleapis.com 61.19.1.54 mt1.googleapis.com 61…

php.ini安全配置详细解释

PHP本身再老版本有一些问题,比如在 php4.3.10和php5.0.3以前有一些比较严重的bug,所以推荐使用新版。另外,目前闹的轰轰烈烈的SQL   Injection也是在PHP上有很多利用方式,所以要保证  安全,PHP代码编写是一方面&am…

5 亿微博数据疑泄露,Python 爬虫如何避免踩天坑?

作者 | 马超来源 | CSDN(ID:CSDNnews)3月19日,默安科技CTO魏兴国发微博称,微博数据泄露了不少用户的手机号,当中涉及不少微博认证的明星和企业家。亦有网友在他的微博评论区表示:“有超过5.38亿…

GDB使用总结

经典编译参数: # cc -g -o xx xx.c 或者 # cc xx.c -g -o xx 如果调试不是进程总的程序 可以直接 #gdb 程序名即可 # i 打印行号 #break 行号 #r 重新开始调试 利用set args 命令就可以修改发送给程序的参数,而使用show args 命令…

Spring概述

Spring 是什么Spring是一个开源的轻量级Java SE(Java 标准版本号)/Java EE(Java 企业版本号)开发应用框架,其目的是用于简化企业级应用程序开发。应用程序是由一组相互协作的对象组成。而在传统应用程序开发中&#xf…

Nginx模块开发

最简单的Nginx模块开发,虽然简单,但是是最重要的第一步。 主要是看:http://blog.codinglabs.org/articles/intro-of-nginx-module-development.html 1.准备模块文件 在nginx-1.4.2安装目录新建一个自己的模块的目录 # mkdir myModule 再新…

程序猿惯用口头禅与内心真实 OS,快来看看你中招没?

作者 | 他二哥来源 | 腾讯技术工程滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS【end】◆精彩推荐◆推荐阅读百万人学AI:CSDN…

每日学习笔记(1)

1,python2.4不支持下面这种异常处理语法 try: except: finally: 只有2.5以上才行,为此只能改成下述写法,damn fuck python 2.4... try: try: except: finally: 2,python实现单例模式的一种方法: class MyCl…

linux svn使用方法

1 安装 svn sudo apt-get install subversion 2 查看svn版本号 svn version 3 下载源代码 下面以举例 svn co svn://192.168.5.88/ erppurchase -username hming -password hming /var/www/test 4更新代码 cd /var/www/test/ svn up 当前目录下所有的文件都更新 svn up -r 200…

64% 的企业未实现智能化,5成公司算法工程师团队规模小于 10人,AI 工程师的机遇在哪里?...

整理 | 夕颜责编 | 唐小引出品 | CSDN(ID:CSDNnews)当前,人工智能技术已应用于各行各业,落地成为大家关注的核心问题。在经历了 2019 年的行业低谷期之后,无论是行业巨头还是新兴独角兽,都开始审视 AI 能够…

指针的本质--u_char*指针在Nginx源码中的应用及原因

GNU下的void *p相当于char *p 也就是移动一个字节。 下面的代码是Nginx中内存池的结构体代码,其中last和end是表示内存地址的。 last是u_char*指针类型也就是unsigned char typedef struct {u_char *last;u_char *end;ngx_pool_t …

原来这就是乡下人

来源:http://user.qzone.qq.com/313998514/blog/1215427152#!app2&viaQZ.HashRefresh&poscatalog_private 今天早晨一早就去做家教了, 原因是我的学生要去香港去学习七天, 明天就要走了, 所以为了赶时间, 今天的课就提到早晨来上. 这些都很正常, 早晨6:17我…

如何查看Apache的连接数和当前连接数

查看Apache的连接数和当前的连接数以及IP访问次数,下面有个不错的示例,大家可以参考下,希望对大家解决问题有所帮助查看了连接数和当前的连接数 复制代码 代码如下:netstat -ant | grep $ip:80 | wc -l netstat -ant | grep $ip:80 | grep ES…

linux环境insight安装与使用

去官网下载:ftp://sourceware.org/pub/insight/releases 安装步骤 # wget ftp://sourceware.org/pub/insight/releases/insight-6.8-1a.tar.bz2 # tar xvf insight-6.8-1a.tar.bz2 # cd ./ # ./configure --prefix/usr/local/insight # make 注意第一次make…

磁盘加密软件TrueCrypt知识大全(二)之创建文件型加密卷

磁盘加密软件TrueCrypt知识大全(二)之创建文件型加密卷 1、在“TrueCrypt”窗口中选择“创建加密卷(C)”按钮,在向导中选择“创建文件型加密卷”,然后一直下一步。 2、在TrueCrypt加密卷创建向导中单击“选…

你的企业在什么情况下需要人工智能?快来看看你需要具备哪些条件与能力吧!...

作者 | Anzhela Sychyk译者 | 风车云马 责编 | 徐威龙出品 | AI科技大本营(ID:rgznai100)如今有关人工智能的炒作多得令人眼花缭乱。各个行业都极力采用这种技术,以获得相对于其他企业的竞争优势——降低运营成本,并改善客户体验。…

struts2学习笔记--线程安全问题小结

在说struts2的线程安全之前,先说一下,什么是线程安全?这是一个网友讲的, 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的&#x…

函数指针--Nginx和Redis中两种回调函数写法

1.Nginx和Redis中两种回调函数写法 #include <stdio.h>//仿Nginx风格 //结构外声明函数指针类型 typedef void (*ngx_connection_handler_pt)(int c); //仿redis风格 typedef void redisCommandProc(int c); typedef struct { int a; //结构内定义函数指针变量pshow voi…

人生苦短,不光要用Python,还要在VSCode里用

作者 | imbennyguo出品 | CSDN博客在程序员圈子里&#xff0c;Visual Studio Code&#xff08;以下简称VSCode&#xff09;可以说是目前最火的代码编辑器之一了。它是微软出品的一款可扩展的轻量级开源编辑器&#xff0c;并且支持全平台系统。这些特性使得VSCode颇受欢迎&#…

从XXX 产品的失败谈起

从XXX 产品的失败谈起 从去年年中公司开始秘密研究一项高级产品&#xff0c;以替换陈旧体系下的老款产品&#xff0c;为此&#xff0c;创建了一个产品开发部 门&#xff0c;由七八个富有本行业开发经验的全职成员构成&#xff0c;经过一年多的努力&#xff0c;即将投入市场了&…

C++ 经常使用类 string类

6.3.2使用string对象 string word"I love China" *链接字符串* string descriptionadjective " " word; _Note_: 不能连接两个字符串字面量&#xff0c;以下的语句是错误的 string test "I have" "a dream"; 6.3.3訪问字符串中的字…

Nginx源码分析--字符串处理

ngx_string.cvoid ngx_strlow(u_char *dst, u_char *src, size_t n); 将src的前n个字符转换成小写存放在dst字符串当中&#xff0c;调用者需要保证dst指向的空间大于等于n。操作不会对原字符串产生变动。如要更改原字符串&#xff0c;可以&#xff1a;ngx_str_t str ngx_strin…

信息保留的二值神经网络IR-Net,落地性能和实用性俱佳 | CVPR 2020

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导语&#xff1a;在CVPR 2020上&#xff0c;商汤研究院链接与编译组和北京航空航天大学刘祥龙老师团队提出了一种旨在优化前后向传播中信息流的实用、高效的网络二值化新算法IR-Net。不同于以往二值神经网络大多关注量…

Jq-table最后一行添加样式

豪情姓名QQE-mail豪情249056406jikeytanggmail.comtony1234567puaggmail.comtony1234567puaggmail.comtony1234567puaggmail.comtony1234567puaggmail.com豪情啊不得了真是的运行代码

Same binary weight (位运算)

题目描述 The binary weight of a positive integer is the number of 1s in its binary representation.for example,the decmial number 1 has a binary weight of 1,and the decimal number 1717 (which is 11010110101 in binary) has a binary weight of 7.Give a positi…

Nginx源码分析--基本数据类型的别名

typedef intptr_t ngx_int_t; typedef uintptr_t ngx_uint_t; typedef intptr_t ngx_flag_t; intptr_t在 # /usr/include/stdint.h 中&#xff0c;下面是stdint.h部分代码 #ifndef _STDINT_H #define _STDINT_H 1#include <features.h> #include…

EnterpriseDB Migration 迁移工具使用测试(2)

下面我们来测试EnterpriseDB Migration 工具对于Oracle 大对象(LOB)的迁移情况&#xff1b; 首先在在Oracle实例Scott模式下创建具有LOB对象的表,如&#xff1a; SQL> create table tlob (t1 int primary key,t2 clob,t3 blob); Table created. -- 并填充数据 SQL> begin…

生物学的机器学习:使用K-Means和PCA进行基因组序列分析 COVID-19接下来如何突变?...

作者 | Andre Ye译者 | 孟翔杰来源 | DeepHub IMBA许多人没有想到&#xff0c;病毒就像地球上为生存而挣扎的其他生物一样&#xff0c;它们会进化或变异。只要看一看人类病毒来源的蝙蝠携带的病毒RNA序列片段即可。AAAATCAAAGCTTGTGTTGAAGAAGTTACAACAACTCTGGAAGAAACTAAGTT…以及…

sql server时间转换

--getdate 获取当前时间select getdate()--dateadd 原有时间加&#xff1a; 2013-02-17 13:20:16 此时间加12个月 select dateadd(MONTH,12,2013-02-17 13:20:16) --返回&#xff1a;2014-02-17 13:20:16.000 &#xff08;参数month可以改为 day&#xff0c;year等日期加相应…

cgdb安装与使用

官网&#xff1a;http://cgdb.github.io/ 安装 # wget http://cgdb.me/files/cgdb-0.6.7.tar.gz # tar -zvxf cgdb-0.6.7.tar.gz # cd cgdb-0.6.7 # ./configure --prefix/usr/local # make && make install 使用 1&#xff1a;cgdb分为上下两栏&#xff0c…