一.语言相关
1.类型
1
2
3
4
5
6
| Java强类型
变量定义,入参,出参有明确类型
Python弱类型
无类型定义,代码风格最好后缀类型,
变量命名最好说明类型,比如a_list, a_tuple, a_dict
python3+版本,支持函数声明类型
|
2.集合
python
list, tuple, dict
足够简洁,无需了解底层,即可快速开发
java
List有ArrayList, LinkedList,Set有HashSet, TreeSet, Map有HashMap, TreeMap
可以根据场景,自由选择,做到性能和内存相关最优
3.并发相关
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| python
锁 threading.Lock
可重入锁 threading.RLock
同步器 threading.Semaphore
队列
collections.deque 双端队列 线程安全 可用来实现栈或者队列
阻塞队列(用于生产者/消费者)
queue.Queue FIFO
queue.LifoQueue LIFO
queue.PriorityQueue 优先级队列
queue.SimpleQueue 无界FIFO队列
asyncio.Queue 协程队列
multiprocessing.Queue 进程队列 进程安全
线程隔离 threading.local
Java
锁 Synchronized, Lock
可重入锁 ReentrantLock
读写锁ReentrantReadWriteLock
同步器 Semaphore CountDownLatch CyclicBarrier
阻塞队列(用于生产者/消费者)
ArrayBlockingQueue 基于数组的阻塞队列 有界
LinkedBlockingQueue 基于链表的阻塞队列 有界
PriorityBlockingQueue 优先级队列 无界
DelayQueue 延迟阻塞队列 无界
并发容器
CopyOnWriteArrayList
ConcurrentHashMap
线程隔离 ThreadLocal
|
4.引申问题
1.解释 编译
1
2
3
4
5
6
7
| Py和Java都需要编译为对应的虚拟机字节码(byteCode), py对应为pyc文件,java为class文件
在运行中虚拟机将字节码翻译为机器码(二进制文件)
Java在运行中,有JIT可以提供运行时编译,可以提供加速
https://stackoverflow.com/questions/13034991/does-the-python-3-interpreter-have-a-jit-feature
为什么JIT加入到py中?pypy适合什么场景?
https://www.quora.com/Why-is-just-in-time-compilation-not-possible-for-Python
https://zh.wikipedia.org/wiki/%E5%8D%B3%E6%99%82%E7%B7%A8%E8%AD%AF
|
2.多线程问题
1
2
3
| Python多线程因为GIL存在,无法利用多核优势,适用于IO操作,比如爬虫
Java无此问题,项目中常用多线程异步来发送报警,或者利用Spring事件消息异步更新缓存
|
3.断言assert
python默认assert开启
Java默认assert关闭
4.函数式编程
1
2
3
4
5
6
7
| Python默认是函数式思想,AOP,闭包等场景非常方便
提供了诸多的函数可以使用,比如map, filter, reduce, sorted, max, min
以及支持列表推导式,lambda函数 使用更方便
Java8提供了stream和lambda支持
stream相关提供了函数支持,表现尚可
AOP可以通过AspectJ或者动态代理来实现,总体比麻烦
|
5.OOP相关
1
2
3
| Java只支持单继承,提供了接口的概念,用来实现多态
Python支持多继承,接口类似的功能可以由mixins实现
python OOP推荐阅读 <https://book.douban.com/subject/26468916/>
|
6.设计模式
1
2
3
| Java更传统
Python多是一些hook
Python设计模式推荐阅读 <https://book.douban.com/subject/26829015/>
|
7.重构/测试相关
1
2
3
4
5
6
7
8
9
| Python传参支持*和**, 所以有些情况下,存在隐式传参的问题
Java传参数个数有限制,最多不要超过4个,也支持多参数,语法为...参数名,但不推荐
如果入参类型或者入参个数不同或者返回类型不同,需要Overload
所以相对重构或者改动来说,Python代码量更少, 但是可读/可维护较弱
测试相关,对于mock等,Python动态语言更有优势
不过Spring等Junit也有不错的支持
|
二.项目相关
1.开发规范
1
2
3
4
5
6
| Java
VO DTO等命名更规范
详件阿里巴巴开发手册 https://github.com/alibaba/p3c
Python
可参考Google编码规范
https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/
|
2.中间件相关
1
2
3
4
5
6
7
8
9
10
11
| ORM相关
Java有Mybatis,半自动化工具
hibernate
JPS
JDBCTemplate
Sharding-JDBC 分库分表
Python有sqlchemy
djangORM
python的orm无半自动化SQL,存在默认查询返回select * 的问题,且无开源分库分表工具
个人更偏好Mybatis
|
3.web框架
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| Java
Jsp+Servlet
Spring
SpringMvc
SpringBoot 自动配置/起步依赖
Jersey REST的更好的实现,简化语法
Dubbo 阿里RPC框架
SpringCloud 官方微服务框架
Python
Django 自带admin管理后台
Flask 小巧快速,插拔式第三方库支持
Tornado 异步IO
Nameko 支持HTTP或者AMQP或者RPC或者WebSocket
任务框架
Java
Spring自带Scheduler, 多机器部署应用,定时任务 则为抢夺式,只能用Redis锁来悲观处理
Quartz分布式任务框架
Python
celery 分布式任务框架
apscheduler 更小巧,内存型任务框架
总体而言, Java框架是基于Spring衍生
Python框架,比较多,更适合运维开发,可以快速迭代
|
三.工具相关
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| Java
1.自带多个命令行工具jstack, jmap
2.动态调试工具
[解密阿里线上问题诊断工具Arthas和jvm-sandbox](https://juejin.cn/post/6844903765145813006)
[Arthas - Alibaba Java Diagnostic Tool](https://arthas.aliyun.com/en-us/)
可以无倾入调试跟踪统计线上问题
3.VisualVM配合jstatd或者程序启动时添加jmx,可以远程实时分析系统
Python
python shell
方便验证一些简单问题,比如求字符串长度,分割字符串等,无需启动程序
flask shell可以用一些CI相关的操作
比如在线上机器,直接import执行某些业务逻辑
比如查询查询应用配置信息,执行Pylint代码检查
Python版本统计耗时脚本
https://github.com/tmacjx/flask-quickstart/blob/master/common/utils/profile.py
无侵入的话,只能dump hprof文件,然后分析火焰图
或者植入第三方服务Datadogs https://www.datadoghq.com
|
总结
1
2
3
4
5
6
7
| 如果内部系统或者项目周期较短,推荐上Python,可以快速迭代
如果对外系统,考虑性能/分布式/微服务等,可以考虑Java
综合来讲,Python开发速度快,但是代码质量比较难控制
Java性能更好,代码量偏多,开源大型轮子也多,胜在后期好维护
But Any Way 代码是人写的, 跟语言和框架无关
综合各个因素,可以自己选择
|
参考
https://python-parallel-programmning-cookbook.readthedocs.io/zh_CN/latest/chapter2/12_Thread_communication_using_a_queue.html
https://juejin.cn/post/6844903608249483277
https://www.cnblogs.com/dolphin0520/p/3932921.html
https://selfboot.cn/2016/08/22/threadlocal_overview/