Python项目可以有多大?最多可以有多少行代码?

全世界有3.14 % 的人已经关注了

数据与算法之美


导读:总是看到有人说,动态一时爽,重构火葬场。然而这世界上有的是著名的开源项目, 也有像 Github、Instagram 这样流量巨大的知名网站是基于动态语言开发的,经过了这么多年重构,也未听说哪个作者进了火葬场的,不明白这些人是真的不知道还是装作看不见呢?


不过他们说动态语言大到一定程度就无法维护,虽然这话也同样不值一驳,不过也提醒了我,我也很好奇用动态语言开发的项目规模能大到什么程度。



640?wx_fmt=jpeg


从我知道的信息看,用动态语言开发的最大规模的项目可能要算是 OpenStack(https://www.openstack.org/)据说代码总量已经达到数百万行,并且还在持续增加中。这当然是一个说明动态语言能力的好例子。不过像这样巨大的项目,要分析起来也并不容易(好吧,真正的原因是我懒得下载那么庞大的代码库)


我选择了 Python 社区中比较知名的一些项目来分析,主要是来自 Github ,也有个别来自其他仓库。这个选择可能包含了一定的主观因素在内,不过我相信大多数项目还是非常有代表性的。


计算代码数量的工具是 cloc(https://github.com/AlDanial/cloc)。所有项目均选择截止到 2018 年 1 月 3 日的主干代码,统计中仅包含 Python 文件,排除了其他文件类型。值得说明的一点是, 通过 Ubuntu APT 默认安装的 cloc 版本 1.60 在统计部分项目的时候存在问题,该问题在最新的版本中已经得到解决,因此本文中所有统计均使用从官网下载的 cloc v1.72。


640?wx_fmt=png


上表已经按代码行数排了序。有意思的一点是, 代码规模最大的前4名中除了 CPython 之外其他三个全部是运维性质的项目,本来我猜测代码应该比较多的项目比如 Odoo 排名反而很靠后。我对运维项目了解有限,不太清楚为什么这些项目的代码规模会名列前茅,或许是因为要支持的内容比较多而杂?


640?wx_fmt=jpeg


本次统计中纯 Python 代码量最大的 Sentry 几乎达到了 70W 行,这是相当有规模的项目了。30W~50W 行代码的项目有三个,包括基础项目 CPython 在内。20W 和 10W 行代码规模的分别有三个,剩下 7 个则在 10W 行以内。


看过这个列表你应当相信,动态语言至少在几十W行代码的项目上是完全没有问题的。这也是绝大多数普通应用的上限了,如果代码真的达到数百万行规模的话,那么无论用什么语言,都势必面临着拆分项目的问题。


上表将代码量指标按照代码/空白/注释进行了分类,也在一定程度上反应了项目的代码风格。Sentry 是本次统计中代码量最多的项目,然而从表中可以看到,项目中的注释和其他项目相比,少得有点不成比例,说明 Sentry 的作者非常不注重注释。


同学们一定发现了,我在列表中除了代码行相关的指标之外还增加了几个其他内容,这也是我个人比较感兴趣的方面。


640?wx_fmt=jpeg


第一个指标是每个文件的平均代码行数。按照模块化的观点,单个文件中堆砌太多内容显然是不合理的,这通常意味着耦合太多、难于理解和修改。然而到底多少算是合适,并没有一个明确的标准。我希望通过这些项目的分析,了解一下开源作者们在实践中做出的选择。


统计的结果分布比较平均,从 100~600行/文件的都存在,并不存在明显的集中点。有趣的是,头两名(Pandas, NumPy)有着紧密的联系,都是和数学统计相关的。这可能是因为数学库的特点比较纯粹而单一,不像其他类库那样容易划分。末尾的项目(Pillow, youtube-dl, Odoo, Scrapy)可以从侧面印证这种猜想:它们都是面向特定领域的,所以更加容易模块化。


640?wx_fmt=jpeg


第二个指标是注释和代码的比例,这个问题也有着类似的情况。注释并非越详尽越好,但总是需要一定量的注释来解释 Why 的问题。注释太少,说明项目的作者没有给后来的维护人员留下足够的线索,可能会造成维护上的问题。另一方面,我们考察的全部是开源项目,没有公司考核或者 KPI 的约束,所以我们可以放心的相信不会存在作者故意多写注释的问题。


前面提到的 Sentry 毫无争议的因为注释太少排到了最后,这未必说明这个项目很差,但至少是一个信号,说明该项目在维护方面可能是存在问题的。而对于那些作者愿意投入精力来写注释的项目(Ansible, NumPy, Fabric, Salt 等)足以反映作者在项目上投入了相当大的心力,这是一个好的信号,说明这些项目是值得信赖的。


有一点是出乎我意料的,那就是作为所有项目之母的 CPython 排名比较靠后,按照道理这个基础项目应该有更多的注释才对。不过再想一想又觉得可以理解,因为 CPython 有单独发布的、非常详尽的文档,这是其他大多数项目都没有的,那么代码中的注释少一些也是情有可原的。


640?wx_fmt=jpeg


最后一项统计是关于文件类型的。Python 项目中绝大多数应该是 Python 代码,这点没有什么疑问,但同时我也想看看除了 Python 代码之外,一个项目还包括哪些主要文件。C/HTML/Javascipt 的上榜是毫不意外的,但有一种文件我事先没有想到,那就是 .PO(开源项目常用的语言资源文件)


对于 Django 和 Django-CMS 这两个项目, PO 代码数量甚至比 Python 代码还要多。大概看了一下,Django 支持 90 种以上的语言,这也无怪乎语言文件的数量如此之多了。


这个结果也可以提醒我们,有些同学——不仅是程序员,也包括大多数经验不足的老板、客户、产品经理等——会下意识的认为程序开发无非是写代码,对于代码之外的其他工作,在估算的时候往往只拍脑袋式的定下一个极短的时间。但对于实际的项目来说,代码仅仅是其中的一部分,“其他工作”有时候——应该说是经常——会占用你大部分的的时间和精力。这些工作往往并不有趣,但对于项目来说又是必不可少的组成部分,希望同学们予以足够的重视。


作者:YUHAO

转自:Python爱好者

原文链接:

https://yuhao.space/blog/2018/1/how-large-python-projects-can-be/

版权归原作者所有,转载仅供学习使用,不用于任何商业用途,如有侵权请留言联系删除,感谢合作。

数据与算法之美

用数据解决不可能


640?wx_fmt=jpeg

长按扫码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从好买辞职后,为什么我会加入一家开源创业公司?

这是头哥侃码的第240篇原创熟悉我的朋友都知道,我是一个闲不住的人。工作之余,我不仅愿意把自己的经验拿出来与大家分享,而且还总是喜欢在字里行间中表达情感,并抒发命运的奇妙与无常。为什么?因为在我看来&#xff0c…

Apache 虚拟主机 VirtualHost 配置

为什么80%的码农都做不了架构师?>>> 虚拟主机 (Virtual Host) 是在同一台机器搭建属于不同域名或者基于不同 IP 的多个网站服务的技术. 可以为运行在同一物理机器上的各个网站指配不同的 IP 和端口, 也可让多个网站拥有不同的域名. Apache 是世界上使用…

selenium java 参数化_Java+selenium 自动化测试【03】-- 数据驱动之参数化

目录1.前言2.读取txt文件实现参数化3.使用Excel表格参数化4.使用TestNG.xml文件参数化5.使用DataProvider传参前言在上一个随笔中,我们已经自动化测试模型,讲到数据驱动模型。数据驱动:是自动化的一个进步,从本意来讲,…

IT公司老板落水,各部门员工怎么救?

公司高层公司副总A:咱们开个会研究一下这个事情怎么处理。公司副总B:如果老板没有救成功,下任是谁呢?会不会影响公司的上市?公司副总C:我认为咱们开会应该讨论两个方案,一个是救人方案&#xff…

这样用Docker 搭建 Jenkins 实现自动部署,你知道吗?

一、为什么用jenkins主要是我们现在的项目都是采用手动部署的,每当给项目中新增一个功能就必须执行(打包--测试--上传测试修复的包到指定服务器--部署上线),这个流程操作起来繁杂,不小心就可能导致部署失败;急需找到一个方式来解决…

struts.properties属性解释

Struts 2框架有两个核心配置文件:struts.xml和struts.properties 其中struts.xml文件主要负责管理应用中的Action映射,以及该Action包含的Result定义等。除此之外,Struts2框架还包含一个struts.properties文件,该文件定义了Struts 2框架的大量…

java if or android_RxJava switchIfEmpty操作符实现Android检查本地缓存逻辑判断

switchIfEmpty(Observable emptyObservable)操作符从字面意思上就很好理解,就是当为空的时候跳转到emptyObservable。那末如何理解当为空的时候. 下面将会使用实际案例解释这个switchIfEmpty的使用方法。业务需求假设我们的app里有加载文章列表功能,要求…

这是对R的误解!R的应用原来这么广!

R作为一种统计分析软件,广泛应用于生物、医学、电商、新闻等数据相关行业,是目前主流数据应用软件之一。为了更好地帮助大家了解并快速入门R语言,现超级数学建模携手柯老师以R语言为基础,向大家隆重推出《R语言基础》系列课。柯老…

WinDBg定位asp.net mvc项目异常崩溃源码位置

项目介绍:asp.net mvc angular iiswindows server系统莫名崩溃最近有个系统默认奇妙崩溃50x,服务整体变成无响应,当运维告知我只有重启应用程序池项目才能正常。我问他如何重现,得到的回复是我这里无法重现,但客户使用…

selenium webdirver之ruby-开发ide安装

这里用到的ide是netbeans ruby环境安装好后,下载netbeans,然后进行安装 netbeans ruby plugins download URL:http://jruby.org.s3.amazonaws.com/downloads/community-ruby/community-ruby_7_1_preview1.zip 解压 打开netbeans,工…

mysql如何和qt连接使用_Qt5学习:连接MySQL数据库

一、环境QT版本:QT 5.8.0(msvc2013_64)MySQL版本:mysql 5.7.19二、配置之前 mysql 数据库一直都连接不上,网上也搜了很多资料,主要还是库文件的问题。重新将 mysql.pro 编译一下,将生成的 .dll 和 .lib 文件拷贝到 QT …

TensorFlow框架的这些操作你肯定不知道!

谷歌在上周正式推出了深度学习框架TensorFlow 1.11.0 版本,那么TensorFlow框架到底是什么?TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。最初由Google大脑小组的研究员和工程师们开发…

C#中HashTable、Dictionary、ConcurrentDictionary区别

一、HashTableHashTable表示键/值对的集合。在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key-value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用…

CDA数据分析师备考必看,L1L2通用

CDA数据分析师L1,L2均可 可安排当月月底的线上考试 线上考的为双机位监考,但是不用担心 安全无隐患,需要联系 当月拿证

[SIR数据集实验][2]Java类数据集相应工具使用的小经验

这段时间安排一个师弟在继续学习SIR数据集的使用和实验方法,这里我先总结点经验。 如果要生成某一个数据集的Fault Matrix,(虽然一般在info目录下有已经生成好的Fault Matrix,但按照Java Object Handbook里面的建议,最…

java 异步读写_Java异步与AIO

异步编程提供了一个非阻塞的,事件驱动的编程模型。 这种编程模型利用系统中多核执行任务来提供并行,因此提高了应用的吞吐率。Java异步编程通常需要使用Future,FutureTask和Callable,其中Future代表未来的某个结果,一般…

你以为妹子穿短裙真的是为了诱惑你吗?

全世界有3.14 % 的人已经关注了数据与算法之美每年暑假,ChinaJoy 都会火热进行,无数一年不出家门的宅男们扛着“长枪大炮”,向着短裙姑娘们就冲过去了。关于裙子,林语堂曾有过一句名言:“演讲应该像女士的裙子&#xf…

聊一聊Jmeter的参数化

背景 前面一篇聊了一下 JMeter 的简单使用,这篇聊一下 JMeter 的参数化。在开始之前先来一个单元测试的例子,感受一下参数化。上面是一个用 xUnit 写的单元测试,这个单元测试就是一个参数化的例子:模拟了不同的输入,调…

Android VNC Server New

Android VNC Server New 关于VNC请参见维基百科:http://zh.wikipedia.org/wiki/VNC关于执行Android VNC Server,请参见前一篇文章:点击链接 一、VNC下载1)fastdroid-vncAndroid VNC Server开源项目 http://code.google.com/p/fast…

python bind sock_python SOCKET编程详细介绍

本章内容1、socket2、IO多路复用3、socketserverSocketsocket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些…