Java 与 Python Web 开发不完全对比
本文比较 Java 与 Python 在 Web 开发时的差异,基于 Python 3.10、Flask 3.x 与 Java 21、spring boot 3.x 的不完全比较。因为 Java 使用时长不超过三个月,所以在比较时可能会有一些偏见,还请海涵。
本文是基于个人经验给出的结论,不承担任何责任。
Java 语言与 Python 语言开发比较
上手难度
新手在学习一门语言时,会需要考虑许多的问题,例如流行程度、运行速度、上手难度。
- 一般能够耳熟能详的编程语言,流行度都是不差的,Python 与 Java 一直也都是编程行业的常青树,没有什么可以比较的。
- 在 CPU 密集型任务下,Java 运行速度比 Python 快一百倍左右。(当在 IO 密集型任务下,程序的运行速度主要在于 IO 的阻塞时间,这个值就只能当做参考了)。如果把系统级语言(C、C++、Rust)当做第一梯队,Java、Go 应该是第二梯队的顶流,而 Python 应该作为第三梯队。但是在这里需要考虑一个问题,那就是很多 Python 库底层都会用 C/C++ 进行优化,实际运行速度并不差。这几年 Python 解释不断优化运行速度,并且由于 Rust 语言的发展,Python 项目的运行速度还在进一步提升。所以给一个及格线。
- 上手难度是新手最容易忽略的。Python 语言非常容易学,只要年龄合适,就可以学习(初中就可以开始)。Java 则是一门专业语言,主要面对专业人士,一般是从大学开始学。Python 学习难度应该是最简单的,很多人连英语都不怎么会,但是会 Python,就能说明一个问题,所以给 10 分。Java 的学习难度并不小, 如果给 C 语言及格线,Java 可以给到 7 分。(低于及格线的就是一些小众语言了,例如 lisp)。
内置工具
内置工具是语言自带的模块、特性,例如系统操作、文件操作、时间日期等。
Python 提供了很多的内置模块,可以非常方便的操作这些东西,所以我给满分 10 分。
Java 虽然也提供了一些工具,但是我用起来觉得很麻烦,很多都要靠拓展工具用起来才方便,给个及格分 6 分吧。
拓展工具
拓展工具主要是指语言的生态。因为本文是讲 Web 开发,所以就不比较爬虫、数据科学、运维相关的工具了。
Java 在国内的 Web 开发市场,应该算是独占鳌头。因为阿里的带动,大部分公司都采用 Java 作为 Web 开发的后端,并且生态非常完善,尤其是 spring 框架,给 10 满分。
Python Web 开发在国内并不流行,使用的大多数都是中小公司。但是站在全球的角度来看,这个份额大概是 Java 的三分之一[^3] 。但是考虑到国内的情况,给个 8 分吧。
Flask 3.x 与 spring boot3 框架比较
框架本身
flask 与 spring boot 都是微框架,flask 是本身就小,而 spring boot 是约定之后变的很小。
spring boot3 包括了 Servlet、spring framework,崇尚的是约定大于配置,使用起来很舒服,开发也很方便。但是框架里面,对于大部分开发者来说都是一个黑盒,东西很多、源码阅读起来也不方便,所以给及格分 6分 吧(但确实很好用)。
flask 框架核心仅以来 Werkzeug 与 jinja2 ,如果只是像 spring boot 一样开发 restful api,那 jinja2 都可以弃用,就只剩下了一个以来。所以学习起来非常轻松,只需要学习 Web 相关的逻辑,没有太多的框架知识,给满分 10 吧(如果是 Django 我给 8)。
框架拓展
spring 全家桶真的非常好用,各种拓展插件用起来很舒服,满分 10 分我可以给到 12 分。
flask 的插件就相对较少了,但是由于框架本身很小,很多工具直接进行集成就可以了。综合考虑给 8 分。
学习成本
spring boot3 的学习成本比较高,需要从 java、Servlet、spring framework 一步一个脚印走过来才比较好。各种拓展插件,需要阅读源码,才能比较方便的使用,给 6 分。
flask 核心很小,学习起来非常方便,实现功能也很简单。拓展工具一般比较简单,学习也方便,给 10 分。
使用场景对比
开发速度
spring boot3 + jpa + spring security(JWT) 的方案开发速度还是很方便,集成日志、缓存等功能也比较方便。idea 的热更新还行,但是启动速度实在太慢(相对 flask 来说)。并且语言本身比较繁琐,会进一步拖累开发速度。
flask + flask-sqlalchemy + flask-jwt-extended 开发速度很快,并且很简单。如果想集成日志、缓存需要自己定义插件,实现也比较方便,但是对开发人员造轮子的能力有一定的要求。由于是动态语言的原因,启动速度、调试速度没得说。
对于我来说,java 的开发速度应该要比 Python 慢 3 - 10 倍左右,应该也有我对 Python 语言更加熟练的原因。但是 Java 的重新编译、启动速度,也比较长,尤其是项目变得庞大之后。在这一方面,综合考虑,如果对语言同等的熟练程度下,Python 比 Java 开发速度快 2 - 6 倍还是比较正常的。
运行速度
根据 https://web-frameworks-benchmark.netlify.app/result?f=flask,spring&mode=dark 网站上的比较,spring boot3 比 flask 的运行速度快 26 倍左右。如果开发了同样的一个 web 程序,默认情况下,flask 的并发数上限是每秒 1 870,spring boot 则是 49 761。但其实不管是一千多还是五万,对于很多网站来说都是够了。如果在程序内部进行优化,是比较容易突破这个限制的。
语言生态
如果单说 web 开发,spring boot 的生态更加完善一些,各种解决方案都有。flask 生态其实还不错,大多数的解决方案都有,但是没有 spring boot 那么完善。但是 flask 有 Python 语言生态的加持。
总结
flask 与 spring boot 开发各自有各自的优点,并没有那个好那个不好,主要看使用场景。如果是没有资源、需要开发速度,则采用 flask 可以节约成本。如果考虑高并发、需要项目的质量,那就采用 spring boot。既想要比较快的开发速度,有想要高性能、高质量,完全可以先用 flask 做原型开发,确定了之后再用 spring boot 开发一次,所需要的成本并不会高出太多。
附录-参考
多语言横向对比 Python 有多慢?: https://juejin.cn/post/7073001978929872927
flask 与 spring boot 运行速度比较: https://web-frameworks-benchmark.netlify.app/result?f=flask,spring&mode=dark
服务器使用的语言比较: Usage statistics of server-side programming languages for websites