一.语言相关

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/