java和python对比

一:解释性和编译型

梳理

编译型:源代码经过编译直接变为二进制的机器语言,每次都可以直接重新运行不需要翻译。典型的就是c语言。

解释性:java和python都是解释型,源代码经过编译变为字节码文件,然后将字节码放在VM上运行,达到跨平台的目的。

java和python都是边解释边执行,但是解释之前都先进行了编译工作,编译为vm能看懂的字节码,vm解释的是字节码,而非源码。

但是为什么python比java慢了一个级别?

主要原因是python是动态语言,java是静态语言。

静态语言:变量声明的时候要声明变量类型,这样编译器在程序运行时直到变量的类型,

动态语言:在程序运行时解释器只知道变量是一个对象,至于具体是什么类型解释器并不知道,所以每次程序运行的时候都要判断变量的类型,才能调用方法,以此来判断此变量对象有没有此方法。

正是因为动态语言多了一个类型判断的过程,因此python比java慢了一个级别。

动态语言是简单,但是解释器在背后做的事情比静态语言的解释器在背后做了更多的事情。

python两个概念,PyCodeObject和pyc文件

在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器真正编译成的结果。

当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。

当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。

所以我们应该这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式。

test.py如下

def test():
    print("Hello World")
if __name=="__main__":
    test() 

此时python test.py发现硬盘中根本没有pyc文件

但是如果把函数定义放到另一个a.py文件中,在test.py中from a import test

此时再python test.py就会发现有了pyc文件。这说明了什么?

说明了pyc文件的目的是为了重用。

python解释器认为只有import的模块,才是要被重用的模块。对于test.py文件来讲,解释器不认为他是需要被重用的模块,因为他会被经常的改动,把它持久化是画蛇添足的,因为每次都要持久化为pyc文件,因此python只会把可重用的模块持久化为pyc文件。

速度

字节码并不能加快程序的运行速度,只是加快了代码的加载速度。

源代码都会被编译为字节码,java和Python都有这一步,当python运行主文件的时候,会将用到的其他模块全部编译为二进制的pyc文件来加快第二次运行程序时加载模块的速度,省去了源代码转为字节码的过程,解释器直接在pvm中拿到pyc文件直接执行。

当创建pyc文件的时候会和模块文件的最后一次修改时间进行映射,一旦第二次运行时会比较修改时间,如果修改时间没变就直接拿pyc文件执行,如果改变了就重新编译。

如果没有创建文件的权限,那么pyc文件是在内存存在的,每次运行pyc文件都是在内存重新编译生成,无法加快程序加载速度。

总结

编译后的字节码文件并不会加快程序的运行速度,只是加快了程序的加载速度。

java和python程序速度差一个量级是因为语言本身的特性,静态和动态,与pyc文件毫无关系。

python是顺序执行代码的和if __name__=="__main__"无关。

一份程序为了区分主动执行还是被调用,Python引入了变量__name__,当文件是被调用时,__name__的值为模块名,当文件被执行时,__name__为‘__main__‘

1 #/usr/bin/env/ python            #(1) 起始行
 2 #"this is a test module"          #(2) 模块文档(文档字符串)
 3 import sys
 4 import os              #(3) 模块导入
 5
 6 debug = True              #(4) (全局)变量定义
 7 class FooClass (object):
 8     ‘foo class‘
 9     pass                           #(5) 类定义(若有)
10 def main():
11     ‘test function‘
12     foo = FooClass()
13     if debug:
14         print ‘ran test()‘         #(6) 函数定义(若有)
15 if __name__ == ‘__main__‘:
16     main()

  

若是文件主动执行了,则最好写成跟上面的例子一样,main之前不要有可执行代码,这样做到程序从main()开始,流程逻辑性强

若是文件作为模块被调用,则可以不用写main(),从上而下顺序执行。

其实Python是否保存成pyc文件和我们在设计缓存系统时是一样的,我们可以仔细想想,到底什么是值得扔在缓存里的,什么是不值得扔在缓存里的。

在跑一个耗时的Python脚本时,我们如何能够稍微压榨一些程序的运行时间,就是将模块从主模块分开。(虽然往往这都不是瓶颈)

在设计一个软件系统时,重用和非重用的东西是不是也应该分开来对待,这是软件设计原则的重要部分。

在设计缓存系统(或者其他系统)时,我们如何来避免程序的过期,其实Python的解释器也为我们提供了一个特别常见而且有效的解决方案。

原文地址:https://www.cnblogs.com/gyxpy/p/11781043.html

时间: 2024-08-30 15:13:37

java和python对比的相关文章

对比java和python对比

对比java和python 对比java和python 2011年04月18日 1.难易度而言.python远远简单于java. 2.开发速度.Python远优于java 3.运行速度.java远优于标准python,pypy和cython可以追赶java,但是两者都没有成熟到可以做项目的程度. 4.可用资源.java一抓一大把,python很少很少,尤其是中文资源. 5.稳定程度.python3和2不兼容,造成了一定程度上的混乱以及大批类库失效.java由于有企业在背后支持所以稳定的多. 6.

Go语言和Java、python等其他语言的对比分析

一.Go语言设计初衷 1.设计Go语言是为了解决当时Google开发遇到的问题: 大量的C++代码,同时又引入了Java和Python 成千上万的工程师 数以万计行的代码 分布式的编译系统 数百万的服务器 2.Google开发中的痛点: 编译慢 失控的依赖 每个工程师只是用了一个语言里面的一部分 程序难以维护(可读性差.文档不清晰等) 更新的花费越来越长 交叉编译困难 3.如何解决当前的问题和痛点? Go希望成为互联网时代的C语言.多数系统级语言(包括Java和C#)的根本编程哲学来源于C++,

java与python在处理大文件操作上的对比

1.问题描述 现在对一个2g的大文件,抽取第二列含有特点16个串的信息,并将这些含有特串的信息,写回到两个文件中 2.具体实现 (1)java代码 package naifen; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java

Python和Java就业前景对比

Python和Java这两大编程语言,很多人都喜欢拿来比较,一个是后起之秀,潜力无限;一个是行业经典,成熟稳定,对于想从事IT技术的人员来说,很难抉择,那么,Python和Java到底哪一个就业前景更好呢? Python在国外应用相对成熟,在国内还处于起步阶段,近两年,随着人工智能.机器学习的.大数据以及云计算的兴起,Python发展势如破竹,很多企业开始进入该行列,Python人才是必不可少环节,然市场Python人才紧缺,因此,Python人才的就业形势和薪资待遇相比于同等资质的IT技术人员

fasttext的基本使用 java 、python为例子

fasttext的基本使用 java .python为例子 今天早上在地铁上看到知乎上看到有人使用fasttext进行文本分类,到公司试了下情况在GitHub上找了下,最开始是c++版本的实现,不过有Java.Python版本的实现了,正好拿下来试试手, python情况: python版本参考,作者提供了详细的实现,并且提供了中文分词之后的数据,正好拿下来用用,感谢作者,代码提供的数据作者都提供了,点后链接在上面有百度盘,可下载,java接口用到的数据也一样: [html] view plai

Java序列化工具对比

1. Java序列化工具技术原理比较 Binary Formats & language-specific ones JavaBuiltIn(java原生).JavaManual(根据成员变量类型,手工写).FstSerliazation.Kryo Binary formats-generic language-unspecific ones Protobuf(Google).Thrift(Facebook). AvroGeneric.Hessian JSON Format Jackson.Gs

Java or Python?测试开发工程师如何选择合适的编程语言?

很多测试开发工程师尤其是刚入行的同学对编程语言和技术栈选择问题特别关注,毕竟掌握一门编程语言要花不少时间成本,也直接关系到未来的面试和就业(不同企业/项目对技术栈要求也不一样),根据自身情况做一个相对正确的选择确实要比盲目投入更明智也更高效. 目前最常见的情况是纠结选择 Java 还是 Python?关于这个问题,我搜索了之前的相关博客,也特意请教了几位资深的测试技术专家,在这里做一个汇总整理,集"各家"之言供大家参考.也欢迎各位朋友根据自己的经验回帖补充意见. P.S. 有一点需要强

Atitit。D&D drag&drop拖拽功能c#.net java swing的对比与实现总结

Atitit.D&D drag&drop拖拽功能c#.net java swing的对比与实现总结 1. 实现一个D&D操作一般包括三个步骤: 1 2. .net黑头的拖曳机制.必须有DragEnter事件(单独写DragDrop事件是不会具有拖拽功能的) 2 3. ---java黑头的拖曳..必须有DragEnter事件(单独写 Drop事件是不会具有拖拽功能的) 2 4. 代码 3 5. 参考 5 1. 实现一个D&D操作一般包括三个步骤: 首先实现一个拖拽源,这个拖拽

利用thrift在c++、java和python之间相互调用

转自:http://blog.csdn.net/andy_yf/article/details/7487384 thrift做为跨语言调用的方案有高效,支持语言较多,成熟等优点:代码侵入较强是其弱点. 下面记录以C++做服务器,C++,java和python做客户端的示例,这个和本人现在工作环境吻合,使用多线程长连接的socket来建立高效分布式系统的跨语言调用平台.遗憾的是目前版本(0.7.0)的C语言还不支持Compact协议,导致在现在的环境中nginx c module调用thrift要