热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么Dropbox等大型服务使用Python作为主要语言,即使它的效率比其他编译型语言低几个数量级?

回复内容:任何XXX语言太慢的观念都是以偏概全。应用程序分很多种,CPUbound,IObound,Memorybound,等等。如果你的程序属于IObound,即使你把整个程
文章目录[隐藏]
  • 回复内容:

回复内容:

任何“XXX语言太慢”的观念都是以偏概全。
应用程序分很多种,CPU bound, I/O bound, Memory bound, 等等。如果你的程序属于I/O bound,即使你把整个程序换成手工优化过的C,速度不会有本质提升。
对于Dropbox来说,其业务逻辑不复杂,性能瓶颈显然在I/O. 除了我估计判重时的 SHA 运算量比较大,但 CPython 的一大本文来源gao@.dai.ma.com搞@^&[email protected])网5优势便是很容易使用 C 写模块,找到 hot spot 后再用 C 来写也不迟。”Premature optimization is the root of all evil.”
既然如此,使用一种性能稍差但易读易写、生态系统完善、跨平台、迭代迅速的语言便是顺理成章的了。
更何况,Guido, Python 的作者,已经被 Dropbox 挖走了。

Python的确比compiled languages(编译型语言)慢几个数量级,但这只与受CPU限制的应用有关。
Dropbox主要受磁盘和网络约束。因此,使用编译型语言并不会明显加快Dropbox,因为大部分时间都花在读写数据而不是计算上。

解释型语言的优点在于开发速度,这也是为什么大多数网站都用解释型语言​作开发。当这些缺点被边缘化时,程序员从这些优点上受益。

参考资料:
William Ting’s answer to Python (programming language): How can some really large services (like Dropbox) afford to use Python as a primary language, if it’s one to two orders of magnitude slower than other, compiled languages?大型服务使用 Python 作为主要语言的,我知道比较有名的是 Dropbox,YouTube,Quora 和知乎。其实分析Dropbox和YouTube为啥使用 Python意义并不大,因为Dropbox的文件同步和 YouTube 的在线视频这种核心的功能,我相信都不是用 Python 来完成的。

反而分析 Quora 和知乎为什么采用 Python 作为主要语言,相对更加准确一些,Quora为什么使用Python,我引用Quora创始人Adam D’Angelo和Charlie Cheever在Quora上的现身说法,知乎为什么使用Python,还请知乎的大牛们现身说法一下。

Adam 在回答中提到,他当初从 Facebook 离职创办 Quora,首先就排除了 PHP,因为作为 Facebook 前 CTO 的他深知PHP 所带来的痛苦;他也考虑过C#,Java,甚至小众的Scala,OCaml 和Haskell,排除C#是不想受限于微软的协议栈,Java 需要的开发周期更长,同时找到熟手较难。最后选择 Python 的原因其实很简单:Adam和另一个创始人Charlie对于 Python 都比较熟悉!

从后面多年的使用情况来看,Adam非常庆幸当初自己的选择:所有的员工都很高兴使用 Python,不管以前的主要语言是什么;Tornado等框架的推出,让更新等实时服务有了好的去处;PyPy可能在不久的将来让 Python 性能有一次大的提升,在这个理想实现之前,Quora性能敏感的后端代码都是使用C++编写的。Charlie也补充说Django, Pylons等好的框架让他们获益颇多,Python 和 Javascript 的数据结构非常和谐,以及邮件服务,任务队列等优秀的第三方库。

引用出处:
Quora Infrastructure: Why did Quora choose Python for its development?我记得有句话是这么说的:
一只木桶盛水的多少,并不取决于桶壁上最高的那块木块,而恰恰取决于桶壁上最短的那块
还有一句话是这么说的:
一条铁链的承重量是由它最脆弱的那一环决定的

对了,这里还有一个图,我觉得最恰当不过了:

结合上面大家的回答,题主应该明白了吧现在大型系统很少用单纯一种语言写出来。。每种语言有每种语言的特色和适用环境。
企业会根据具体的使用环境(IO密集还是计算密集、开发效率等)来为不同的组件选择不同的语言。
对于那些对效率要求极高,但很少改动的地方用编译型语言。对开发效率要求极高,三天两头就要加入新功能的组件来说,上线所需的“时间成本”要比为了提升速度所需的“硬件投入”要值钱得多。
使用解释型语言的主要环境就是在“以(硬件占地)空间换(开发)时间”的一种经济的行为。。对于这样逻辑相对简单,要求的是大并发量的网络运用,语言本身的性能影响并不显著,更多的瓶颈在于IO性能上,所以用什么语言区别并不是特别大,那么使用快速开发,快速迭代,快速部署的语言,比用C这样追求性能的语言,在开发效率和整体成本上更合适。关键是IO速度慢 也就显不出python慢了Dropbox这种客户端使用到的算法部分使用了C EXT,甚至其UI库wxwidget也是Python套的壳,速度瓶颈的地方都是C代码,所以还好。
至于服务器端,Dropbox的情况不太清楚,例如Quora已经全面转Cython以承受更大的负载,我想Dropbox服务器端也不可能纯Python来实现。初期上线就是看谁更敏捷曾经看过dropbox开发者的几篇博文。他们采用python的主要原因是可以比较简单的实现跨平台,而且开发速度快,进而实现快速上线的目的。你可以用谷歌搜索一下dropbox的技术栈,会找到我说的博文的。



推荐阅读
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • CentOS 7 中 iptables 过滤表实例与 NAT 表应用详解
    在 CentOS 7 系统中,iptables 的过滤表和 NAT 表具有重要的应用价值。本文通过具体实例详细介绍了如何配置 iptables 的过滤表,包括编写脚本文件 `/usr/local/sbin/iptables.sh`,并使用 `iptables -F` 清空现有规则。此外,还深入探讨了 NAT 表的配置方法,帮助读者更好地理解和应用这些网络防火墙技术。 ... [详细]
  • 本文对SQL Server系统进行了基本概述,并深入解析了其核心功能。SQL Server不仅提供了强大的数据存储和管理能力,还支持复杂的查询操作和事务处理。通过MyEclipse、SQL Server和Tomcat的集成开发环境,可以高效地构建银行转账系统。在实现过程中,需要确保表单参数与后台代码中的属性值一致,同时在Servlet中处理用户登录验证,以确保系统的安全性和可靠性。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • Composer 无法加载本地第三方库?如何解决这一常见问题 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 本文全面解析了 Python 中字符串处理的常用操作与技巧。首先介绍了如何通过 `s.strip()`, `s.lstrip()` 和 `s.rstrip()` 方法去除字符串中的空格和特殊符号。接着,详细讲解了字符串复制的方法,包括使用 `sStr1 = sStr2` 进行简单的赋值复制。此外,还探讨了字符串连接、分割、替换等高级操作,并提供了丰富的示例代码,帮助读者深入理解和掌握这些实用技巧。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 在本文中,我们将探讨如何在Docker环境中高效地管理和利用数据库。首先,需要安装Docker Desktop以确保本地环境准备就绪。接下来,可以从Docker Hub中选择合适的数据库镜像,并通过简单的命令将其拉取到本地。此外,我们还将介绍如何配置和优化这些数据库容器,以实现最佳性能和安全性。 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 探索偶数次幂二项式系数的求和方法及其数学意义 ... [详细]
  • 本文详细探讨了OpenCV中人脸检测算法的实现原理与代码结构。通过分析核心函数和关键步骤,揭示了OpenCV如何高效地进行人脸检测。文章不仅提供了代码示例,还深入解释了算法背后的数学模型和优化技巧,为开发者提供了全面的理解和实用的参考。 ... [详细]
  • 深入解析 OpenCV 2 中 Mat 对象的类型、深度与步长属性
    在OpenCV 2中,`Mat`类作为核心组件,对于图像处理至关重要。本文将深入探讨`Mat`对象的类型、深度与步长属性,这些属性是理解和优化图像操作的基础。通过具体示例,我们将展示如何利用这些属性实现高效的图像缩小功能。此外,还将讨论这些属性在实际应用中的重要性和常见误区,帮助读者更好地掌握`Mat`类的使用方法。 ... [详细]
author-avatar
保佑想-回丽水的阿卉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有