Python和Java的对⽐
(今天实习⾯试⼜问道这个问题了,答的不是很好= = )
静态语⾔和动态语⾔
常见的语⾔按照动态语⾔和静态语⾔来分类:
静态语⾔:
java, c, c++, go等
强类型语⾔(静态类型语⾔)是指需要进⾏变量/对象类型声明的语⾔,⼀般情况下需要编译执⾏。强类型语⾔是⼀旦变量的类型被确定,就不能转化的语⾔。
动态语⾔:
python, javascript, php, ruby等
弱类型语⾔(动态类型语⾔)是指不需要进⾏变量/对象类型声明的语⾔,⼀般情况下不需要编译(但也有编译型的)。动态类型语⾔是在运⾏时确定数据类型的语⾔。变量使⽤
之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。
弱类型语⾔则反之,⼀个变量的类型是由其应⽤上下⽂确定的。
静态语⾔优势
由于类型的强制声明,使得IDE有很强的代码感知能⼒,故,在实现复杂的业务逻辑、开发⼤型商业系统、以及那些⽣命周期很长的应⽤中,依托IDE对系统的开发很
有保障;
由于静态语⾔相对⽐较封闭,使得第三⽅开发包对代码的侵害性可以降到最低;
动态语⾔的优势:
1. 在静态语⾔中的⼀些⾼级概念,如java中的反射以及基于反射实现的AOP,这些概念对java初学者以及只有⼀两年⼯作经验的⼈来说,这⼏个概念是很难理解
的,更不⽤说如何去⾃⼰实现。如果⼤家使⽤过AOP的话就会明⽩这⼏个概念从理解到熟练使⽤是⽐较难的,⽽且开发效率会⽐较低,尽管同学可能会说“其实
使⽤起来还是很简单啊”,那可能是因为你没有⽤过动态语⾔中的装饰器。
2. 动态语⾔中对于java中的AOP这种概念直接使⽤装饰器就可以完成⽽且是python语⾔本⾝的⼀部分。并不像java中还需要引⼊第三⽅来完成。
3. python能轻松完成这些正是由于python是⼀门动态语⾔, 动态语⾔的特性使得⼤家去⾃⼰控制整个类的初始化以及动态去改变对象变的异常简单,这些特性使得
动态语⾔的灵活性远远超过静态语⾔。
解释型语⾔和编译型语⾔
这⾥的解释执⾏是相对于编译执⾏⽽⾔的。我们都知道,使⽤C/C++之类的编译性语⾔编写的程序,是需要从源⽂件转换成计算机使⽤的机器语⾔,经过链接器链接之后形成了
⼆进制的可执⾏⽂件。运⾏该程序的时候,就可以把⼆进制程序从硬盘载⼊到内存中并运⾏。
python的执⾏过程和Java是类似的:
python解释器将源代码转换为字节码,然后再由python解释器来执⾏这些字节码。
⼀个具体的Python程序的执⾏过程:
- 执⾏python程序后,将会启动 Python 的解释器,然后将python程序编译成⼀个字节码对象 PyCodeObject。
- 在运⾏期间,编译结果也就是 PyCodeObject 对象,只会存在于内存中,⽽当这个模块的 Python 代码执⾏完后,就会将编译结果保存到了 pyc ⽂件中,这样下次就不⽤编译,直接加载到内存中。pyc ⽂件只是 PyCodeObject 对象在硬盘上的表现 - 这个 PyCodeObject 对象包含了 Python 源代码中的字符串,常量值,以及通过语法解析后编译⽣成的字节码指令。PyCodeObject 对象还会存储这些字节码指令与原始代码⾏号的对应关系,这样当出现异常时,就能指明位于哪⼀⾏的代码。
Java也是先编译成字节码,再去执⾏
解释器,java很特殊,java是需要编译的,但是没有直接编译成机器语⾔,⽽是编译成字节码,然后在Java虚拟机上⽤解释的⽅式执⾏字节码。Python也使⽤了类似的⽅
式,先将python编译成python字节码,然后由⼀个专门的python字节码解释器负责解释执⾏字节码。
Python 的GIL
GIL的全称是Global Interpreter Lock(全局解释器锁)来源是python设计之初的考虑,为了数据安全所做的决定。
在Python多线程下,每个线程的执⾏⽅式:
1.获取GIL
2.执⾏代码直到sleep或者是python虚拟机将其挂起。
3.释放GIL
可见,某个线程想要执⾏,必须先拿到GIL,我们可以把GIL看作是“通⾏证”,并且在⼀个python进程中,GIL只有⼀个。拿不到通⾏证的线程,就不允许进⼊CPU执⾏。
⽽每次释放GIL锁,线程进⾏锁竞争、切换线程,会消耗资源。并且由于GIL锁存在,python⾥⼀个进程永远只能同时执⾏⼀个线程(拿到GIL的线程才能执⾏),这就是为什么在多
python转java代码
核CPU上,python的多线程效率并不⾼。
每个进程有各⾃独⽴的GIL,互不⼲扰,这样就可以真正意义上的并⾏执⾏,所以在python中,多进程的执⾏效率优于多线程(仅仅针对多核CPU⽽⾔)。
由于 GIL 的存在,Python 的多线程性能⼗分低下,⽆法发挥多核 CPU 的优势,性能甚⾄不如单线程。因此如果你想⽤到多核 CPU,⼀个建议是使⽤多进程或者协程。
Python垃圾回收
在讲到垃圾回收的时候,通常会使⽤引⽤计数的模型,这是⼀种最直观,最简单的垃圾收集技术。Python 同样也使⽤了引⽤计数,但是引⽤计数存在这些缺点:
1. 频繁更新引⽤计数会降低运⾏效率
2. 引⽤计数⽆法解决循环引⽤问题
Python 在引⽤计数机制的基础上,使⽤了主流垃圾收集技术中的标记——清除和分代收集两种技术。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。