一开始我以为是一篇2013年的老帖子,没想到竟然是2015年。不懂Python不要乱喷啊。你直接说“我不懂Python,我也不愿意维护前任写的糟糕代码,我Go牛B,所以我要重构一遍!”我到觉得你智商正常点。。

我觉得go不错,但是如果不是特定领域开发,没有足够多成熟稳定的库仍然很麻烦的事情。

python虽然很强大,但我们在使用的时候也碰到了一些问题,主要由如下几个方面:

动态语言

python是一门动态强类型语言。但是,仍然可能出现int + string这样的运行时错误,因为对于一个变量,在写代码的时候,我们有时候很容易就忘记这个变量到底是啥类型的了(点评: 真的很少遇到, 每个函数的参数类型都有约定, 所以根本不会记不得)。

在python里面,可以允许同名函数的出现,后一个函数会覆盖前一个函数,有一次我们系统一个很严重的错误就是因为这个导致的。(点评:遇到过,不过这也是不遵循约定导致的,命名不规范的缘故,在不同模块采用相同的名称是可以的,另外这个问题在静态语言里也有啊,你链接到一个错误的库上。 在运行时用后一个函数会覆盖前一个函数,这也正是monkey patch存在的基础。虽然我觉得如果在语言层面上对用户可以对变量的类型进行显式声明的约束很有用)

上面说到的这些,静态语言在编译的时候就能帮我们检测出来,而不需要等到运行时出问题才知道。虽然我们有很完善的测试用例,但总有case遗漏的情况。所以每次出现运行时错误,我心里都想着如果能在编译的时候就发现该多好。(点评: 有了编译时检查运行时就不出错了么?  难道代码写完了就完了么? 差不多每次添加功能或者调试的时候,读到感觉写的不好或者写的不清楚的,都要做些清理,毕竟人对于所使用的库或者语言的理解是逐步深入的。 )

性能

其实这个一直是很多人吐槽python的地方,但python有它适合干的事情,硬是要用python进行一些高性能模块的开发,那也有点难为它了。

python的GIL导致无法真正的多线程,大家可能会说我用多进程不就完了。但如果一些计算需要涉及到多进程交互,进程之间的通讯开销也是不得不考虑的。

无状态的分布式处理使用多进程很方便,譬如处理http请求,我们就是在nginx后面挂载了200多个django server来处理http的,但这么多个进程自然导致整体机器负载偏高。

但即使我们使用了多个django进程来处理http请求,对于一些超大量请求,python仍然处理不过来。所以我们使用openresty,将高频次的http请求使用lua来实现。可这样又导致使用两种开发语言,而且一些逻辑还得写两份不同的代码。(点评:不用django,没有发言权,不过高频的请求可以用Cython优化,现在的Cython已经比2013年的时候方便多了。。。)

同步网络模型

django的网络是同步阻塞的,也就是说,如果我们需要访问外部的一个服务,在等待结果返回这段时间,django不能处理任何其他的逻辑(当然,多线程的除外)。如果访问外部服务需要很长时间,那就意味着我们的整个服务几乎在很长一段时间完全不可用。

为了解决这个问题,我们只能不断的多开django进程,同时需要保证所有服务都能快速的处理响应,但想想这其实是一件很不靠谱的事情。

异步网络模型

tornado的网络模型是异步的,这意味着它不会出现django那样因为外部服务不可用导致这个服务无法响应的问题。话说,比起django,我可是非常喜欢tornado的,小巧简单,以前还写过几篇深入剖析tornado的文章了。虽然tornado是异步的,但是python的mysql库都不支持异步,这也就意味着如果我们在tornado里面访问数据库,我们仍然可能面临因为数据库问题造成的整个服务不可用。(点评:历史原因,几乎所有Python的标准库都是同步的,)

其实异步模型最大的问题在于代码逻辑的割裂,因为是事件触发的,所以我们都是通过callback进行相关处理,于是代码里面就经常出现干一件事情,传一个callback,然后callback里面又传callback的情况,这样的结果就是整个代码逻辑非常混乱。python没有原生的协程支持,虽然可以通过gevent,greenlet这种的上patch方式来支持协程,但毕竟更改了python源码。另外,python的yield也可以进行简单的协程模拟,但毕竟不能跨堆栈,局限性很大,不知道3.x的版本有没有改进。(点评: Python3.4引入asyncio,Python3.5引入的async和await,就算使用Twisted,也不会一堆callback啊。有没有搞错?不清楚跨堆栈)

开发运维部署

当我第一次使用python开发项目,我是没成功安装上项目需要的包的,光安装成功mysql库就弄了很久。后来,是一位同事将他整个python目录打包给我用,我才能正常的将项目跑起来。话说,现在有了docker,是多么让人幸福的一件事情。(点评: 没有用过虚拟Python环境?virtualenv,python直接调用mysql connector,怎么会装一堆库?不明所以)

而部署python服务的时候,我们需要在服务器上面安装一堆的包,光是这一点就让人很麻烦,虽然可以通过puppet,salt这些自动化工具解决部署问题,但相比而言,静态编译语言只用扔一个二进制文件,可就方便太多了。( 点评:测试环境就是开发环境,你确定静态编译的不解决好依赖在别的机子上面就能跑?)

代码失控

python非常灵活简单,写c几十行代码才能搞定的功能,python一行代码没准就能解决。但是太简单,反而导致很多同学无法对代码进行深层次的思考,对整个架构进行细致的考量。来了一个需求,啪啪啪,键盘敲完开速实现,结果就是代码越来越混乱,最终导致了整个项目代码失控。

虽然这也有我们自身的原因,譬如没好的代码review机制,没有好的项目规范,但个人感觉,如果一个程序员没经过良好的编码训练,用python很容易就写出烂的代码,因为太自由了。

当然,我这里并不是说用python无法进行大型项目的开发,豆瓣,dropbox都是很好的例子,只是在我们项目中,我们的python代码失控了。(点评:好像没有听说用了那种语言代码就不失控了,这根本就是拒绝小步重构,代码模块化差,模块耦合度高等等一系列问题导致的,Python的实现代码少,反而能够有精力进行持续的快速改进。。)

上面提到的都是我们在实际项目中使用python遇到的问题,虽然最终都解决了,但是让我愈发的觉得,随着项目复杂度的增大,流量性能压力的增大,python并不是一个很好的选择。

(点评: Python存在问题吗? 当然也有很多,比如

* 配套的异步库太少且缺乏维护。

* 不能限制变量的类型(虽然有Python3.5的type hints,但是和注释没啥区别)

* 本身的计算性能比V8引擎的JavaScript要差很多(可以借助C)

有疑问加站长微信联系(非本文作者)

python转go感觉难_读《我为什么从python转向go》的一些感受相关推荐

  1. python入门容易精通难_我珍藏的一些好的Python代码,技巧

    最近后台关注的粉丝越来越多,大部分其实还是偏入门和基础!很多小伙伴加了菜鸟学Python小助手的微信,有一些在问一些入门的问题,有一些在问如何学习Python. 其实Python是入门容易精通难,大家 ...

  2. python网络编程好学吗_年薪30万+的python编程难不难?好学吗?

    首先先了解下派森?什么是Python? python翻译成中文就是蟒;蚺蛇的意思.在计算机专业里面Python是一门课程,专门学习计算机编程的课程,是一种跨平台的计算机程序设计语言.一种高级,热门的编 ...

  3. python做自动化测试的优点_乐搏讲自动化测试-python语言特点及优缺点(5)

    相信小伙伴们都知道,随着软件测试行业的发展和进步自动化测试已经成为必然.在竞争日益激烈的市场环境中也是你升职加薪的利器. 所以,小编决定从今天起!将要系统.连续.高质量的持续更新「整套自动化测试」文章 ...

  4. python 爬取财经新闻_如何用 100 行 Python 代码实现新闻爬虫?

    CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 每天我都要坐地铁上班,而地铁里完全没有手机信号.但我希望在坐地铁的时候读些新闻,于是就写了下面这个新闻爬虫. 我 ...

  5. 以下不属于python特点的是什么_以下哪一个不属于python语言的特点-Python语言的特点有哪些...

    Python语言的特点有哪些 Python 是目前最流行的语言之一,从云计算.大数据到人工智能,Python 无处不在,Python 人才需求量也在逐年攀升,Python 为何能发展如此的迅猛,究竟有 ...

  6. 会python的人多吗_为什么很多人喜欢 Python?

    对于这个问题,汇智妹为大家请来了我们汇智动力的技术大咖--贵哥,贵哥从事近20年的软件开发.测试工作,今天就让他来为我们谈谈Python这门计算机语言. 福贵哥作为一个多年在IT界摸爬滚打的老兵,因项 ...

  7. python中年大叔学编程_中年大叔学编程-Python简单操作文件

    原标题:中年大叔学编程-Python简单操作文件 在计算机中,经常打交道的就是各种文档,用得比较多的软件就是office和记事本来操作文件,那么我们试试用Python来简单读写文件. Open函数的用 ...

  8. python 结构体数组 定义_一篇文章弄懂Python中所有数组数据类型

    前言 数组类型是各种编程语言中基本的数组结构了,本文来盘点下Python中各种"数组"类型的实现. list tuple array.array str bytes bytearr ...

  9. python如何跳出外层循环_失去循环标签的Python,我这样实现跳出外层循环

    不完美的Python 自从各类Python大火,感觉天上地下哪儿都有Python的一席之地,Python功夫好啊-但python有些细节上缺少其他语言的便利.今天我们就来举几个例子. 跳出外层循环 大 ...

最新文章

  1. python合并文件_python把多个文件合并到一个新文件
  2. 虚拟机Linux图形界面配置NAT-桥接
  3. WebView 和JS 之间交互
  4. (数据库系统概论|王珊)第九章关系查询处理和关系优化-第三节:查询优化之代数优化
  5. c++工作笔记001---c++相关零碎要点_endl、“\n”和‘\n’区别_extern int a关键字_-的意思_::的意思_指针和引用的区别
  6. 2016.08.15
  7. Django搭建登录注册功能
  8. android screencap 源码,android后台截屏实现(3)--编译screencap
  9. WordPress简约mkBlog博客主题模板v2.1
  10. 大数据与AI平台:物联网时代的数据智能 PPT分享
  11. python中去除空格用什么函数_python中用什么函数去掉空格
  12. 芝麻信用商家接入指南
  13. 【洛谷】P1957 口算练习题
  14. 转:这些道理不懂,你注定就是穷打工的命
  15. python视频教程推荐it教程网_Python视频教程之入门基础篇_IT教程网
  16. pyqt5 selenium 等待元素出现 visibility_of_element_located
  17. 代码生成MANIFEST.MF文件
  18. Python|用turtle画笔画爱心
  19. 【航线运输驾驶员理论考试】气象学
  20. 基于腾讯云搭建属于自己的Fiora聊天室

热门文章

  1. WPF阴影效果(DropShadowEffect)
  2. JavaScript闭包函数的理解与使用
  3. Android的内存分配与回收
  4. 基于指定文本的百度地图poi城市检索的使用(思路最重要)
  5. 《精通移动app测试实战:技术、工具和案例》新书上市
  6. tab使用 TabActivity TabHost Tabspec常用方法
  7. The following module was built either with optimizations enabled or without debug information - winz
  8. 用Delphi写扬声器音乐
  9. 基于用例的工作量估计
  10. Android 日夜间切换Demo