`
matt.u
  • 浏览: 127535 次
  • 性别: Icon_minigender_1
  • 来自: CQ
社区版块
存档分类
最新评论

(转)Python编程语言与Java的性能比较

阅读更多
摘自http://developer.51cto.com/art/201003/187962.htm

Python编程语言目前的使用中需要不断的学习。下面我们就详细的看看如何才能更好的进行相关知识的学习。最近我一直在看一个基于wxPython的GUI应用程序代码,大概45.5KLOC的左右,而且这还不包括它所用到的库(如Twisted)。

代码是由那些对Python比较生疏的Java的开发者写的,所以它存在很严重的性能问题(如三十秒的启动时间)。在检查代码的时候,我发现他们写了很多在Java中能讲得通但是对 Python编程语言来说去却是很难接受的东西。并不是因为“Python比Java慢”,而是因为在Python中有更方便的方法去完成同样的目标,甚至是在Java中不可能的事情。

所以,令人难过的事就是这些家伙事倍功半,写的那些代码比本应合乎用Python编程语言实现的慢很多。下面,让我们来看一些例子:

◆Java中的静态方法不能翻译成Python的类方法。

哦,当然,他多多少少也能产生同样的效果,但类方法的目的实际上是做一些通常在Java中甚至都不可能的事情(如继承一个非默认的默认函数)。Java静态方法惯用的翻译通常翻译成一个模块级的函数,而不是一个类方法或静态方法。(并且静态常量应该翻译成模块级常量.)
这不是性能上的问题,但是一个Python编程语言程序员如果想调用Foo.someMethod,他要是被迫采用像Java中 Foo.Foo.someMethod的方式去做的话,那么他就会被逼疯的。有一点一定要注意:调用一个类方法需要一个额外的存储空间,而调用静态方法或函数就不需要这样.

对了,还有就是这些Foo.Bar.Baz的属性链也不是自己就能数出来的.在Java中,这些带点的名称是有编译器来查找的,运行的时候并不会去考虑一共有多少.而在Python中,查找的过程是在运行时进行的,所以要包括每个点.(在Python中,要记住一点,"平铺的结构别嵌套的要好",尽管相对于从性能方面来说,可能它更多涉及的是"可读性"和"简单要比复杂好".)


◆要使用switch语句吗?Python编程语言将是一个哈希表,不是一堆if-then语句。
要使用在Java中不是switch语句而且还有字符串参与了的一堆if-then语句吗?它将仍然是一个哈希表。CPython字典是用在我们所了解的领域中认为是最佳性能之一的哈希表来实现的。你自己所写的代码也不会比这个再好了,除非你是Guido、Tim Peters和Raymond Hettinger的私生子,而且还是遗传增强了的。



◆XML不是答案。它也不是一个问题。现在用正则表达式来解释Jamie Zawinski,“一些人,当他遇到一个问题的时候,就会想‘我知道,我要用XML.’那么他们就有两个问题了。”


相对于在Java中来说这是个不同的情况,因为比起Java代码,XML是灵活而且有弹性的。但比起Python的代码来,XML就是一个船锚,一个累赘。在Python中,XML是用来协同工作的,而不是你的核心功能,因为你不需要那么做。在Java中,XML可能是你的救世主,因为它让你实现了特定领域的语言并且“不用编码”就提高你的应用程序的适应性。在Java中,避免编码是一个很大的优势,因为编码意味着重新编译。但在Python中,通常是,写代码比写XML更简单。还有就是Python处理代码要比处理XML快很多很多。(不仅仅是这个,你必须写XML处理代码,同时Python就已经为你写好了.)

如果你是一个Java程序员,你并不能利用本能知觉来考虑你是否要在你的Python核心应用中使用XML作为一部分。如果你不是因为信息交互的原因去实现一个已经存在的XML标准或是建立某种输入、输出格式或者建立某种XML编辑器或处理工具,那么就不要这么做。根本不要去这么做。甚至连想都不要想。现在,丢掉那个XML模式然后把你的手解放出来吧!如果你的应用程序或者平台要被Python编程语言开发者使用,他们只会感谢你不要在他们的工作中添加使用XML的负担。

(这里唯一的例外是如果你的客户(your target audience)确确实实因为某些原因而需要使用XML。就好像,他们拒绝学习Python但如果你使用XML他们就给你付钱,或者你打算给他们一个很棒的能编辑XML的GUI,还有就是这个XML的GUI是另一个人写的,同时你得到免费使用的权利。还有一些很少见的架构上的原因需要用到XML。相信我,它们不会应用到你的程序中去的。如果有疑问,对一个资深的Python开发员解释你的用例。或者,如果你脸皮厚而且不介意被人嘲笑的话,试试向一个 Lisp程序解释你的程序为什么要用XML!)


◆Getter和setter是恶魔。我应该说它是恶魔,是魔鬼!
Python编程语言对象不是Java Bean。不要写什么getter和setter,而是还把它们内置在“属性”里面。它直到你能证明你需要比一个简单访问复杂一点的功能时才有意义,要不然,不要写getter和setter。它们是CPU时间的浪费,更要紧的是,它们还是程序员宝贵时间的浪费。不仅仅对于写代码和测试的人,对于那些要阅读和理解它们的人也是。

在Java中,你必须使用getter和setter,因为公共字段不允许你以后改变想法再去使用getter和setter。所以,在Java中你最好事先避开这些"家务杂事".在Python中,这样做很傻,因为你可以以一个普通特性开始并可以在任何时间改变你的想法,而不用影响到这个类的任何客户。所以不要写getter和setter方法。


◆代码重复在Java中通常来说就是一场不可避免的灾祸,你必须经常反复地写同一个方法而只有一点点的变化(通常是这是因为静态类型约束)。
在 Python中这样做是没有必要的也是不值得的(除了极少数一些特定的场合需要内联一些要求性能的函数)。如果你发现自己一遍一遍在写同样的代码而且变化很少,你就需要去学一下闭包。他们实际不并是那么可怕。

这就是你要做的。你写了一个包含了函数的函数。这里内部的函数就是你要一遍遍写的函数的模版,但是在里面加入了针对不同情况的函数要使用变量。外部的函数需要刚刚提高的那种变量作为参数,并且将内部的函数作为结果返回。然后,每次你要写另一种略微不同的函数的时候,你只要调用这个外部的函数,并且把返回值赋给你要让“重复”函数出现的名字。现在,如果你需要改变这个工作方式,你只需要改变一个地方:这个模版。

在我所看过的应用程序/平台中,只有一个很微不足道的程序使用了这个技术,它去掉了数百行重负的代码。实际上,因为开发者使用了特别的样板文件来为这个平台开发插件,所以这会节省很多很多第三方开发人员的代码,同时也使那些程序员要学习的东西变得简单了。

这只是Java->Python编程语言思维方式转变的冰山一角而已,现在我能正确的转变而不用去钻研程序的细节。本质上,如果你曾经用过一段时间Java,而且对Python比较陌生,那么你不要太相信自己的本能。你的本能已经被Java调节,而不是Python。向后退一步来说,最重要的是不要再写这么多代码了。

为了这样做,让自己觉得更加需要Python。假装好像Python是可以做任何你想做的魔棒,而你无须出一点力。问一下,“Python怎样解决我的问题?”还有“Python语言的哪个特点和我的问题最相似?”如果对于你需要的东西其实已经有了某种固定形式,那么你绝对会感到惊讶的。事实上,这种现象实在是太普遍了,甚至即使在很有经验的Python程序员中也会出现,以至于Python社区中给这种现象起了个名字。我们称之为“GUIDO的时间机器”,因为在我们自己还没有掌握它之前,通常看上去要得到我们所需要的东西好像那是唯一的方法。

所以,如果你在使用Python编程语言时候不能感到比使用Java要至少多出10倍的生产力话,你就最好做一下改动,你是不是忘记使用time machine!(chances are good that you've been forgetting to use the time machine)(同时如果你还怀念你的Java IDE,你可以这样想:因为你写的Python程序比他所需要的要复杂得多.)
分享到:
评论

相关推荐

    编程语言算法集 Python.rar

     Julia 的崛起,与目前编程语言发展遭遇的瓶颈息息相关:随着人工智能尤其是机器学习的兴起,现实世界对计算的速度及性能要求也越来越高,不同的编程语言由于自身的局限性难以兼顾,例如说,在 Julia 诞生之前,...

    cpp-一些觉见编程语言的原生性能比较

    一些编程语言(JavaScript,Kotlin,Rust,Swift,Nim,Python,Go,Haskell,D,C ,Java,C#,Object Pascal,Ada)的原生性能比较

    知识领域: 软件开发 数据结构与算法 网络编程 数据库管理 技术关键词: 编程语言: Python, Java, C++ Web

    工作经验: 软件工程师,ABC科技有限公司,2018年至今 开发和维护公司核心产品的新功能和模块 负责设计和实施数据库架构,提高系统的性能...Python编程证书,Coursera,2019 最佳创意项目奖,校级比赛,2017 语言能力:

    Python(面向对象编程语言) v3.4.0.zip

    与其他主要的语言如 C 和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。 可扩展性————如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C 编写,然后在...

    eC语言: 拥有C++项目的性能和Java的跨平台性以及Python的方便性

    eC,是一位加拿大人jerome历时十二年开发的一门编译型编程语言,拥有C++项目的性能和Java的跨平台性以及Python的方便性。  目前eC拥有自己的IDE,专用的面向对象数据库。  eC的理念是:开发一次,部署在所有平台,...

    机器人编程语言python-10大热门机器人编程语言,你掌握了哪种?.pdf

    与Java不同,Python的重点是易⽤性,Python不需要很多时间来做常规的事情,如定 义和强制转换变量类型。这些在编程⾥⾯本是很平常的事。另外,Python还有⼤量的免费库。⽽且因为Python允许与C/C++代码进⾏简 单的...

    Python 核心编程 目录

     通过用C等语言编写扩展来提升Python应用程序的性能,或者通过使用多线程增强I/O相关的应用程序的能力;  学习Python中有关数据库的API,以及如何在Python中使用各种不同的数据库系统,包括MySQL、Postgres和...

    JAVA,10亿个数整除7个数,10亿次求余,编程语言性能测试

    JAVA,10亿个数整除7个数,10亿次求余,编程语言性能测试 vc++,python,.net /.net core/rust,js等

    基于Python的量子软件开发工具包 (SDK) 它通过混合量子编程语言功能和高性能模拟器为高级用户提供全栈编程体验

    QCompute 是基于 Python 的量子软件开发工具包 (SDK)。它通过混合量子编程语言功能和高性能模拟器为高级用户提供全栈编程体验。

    Python简介.doc

    技术支持和服务 什么是 Python 语言 Python 语言是一种计算机编程语言,作用类似于 c/c++/java/perl/VB/Delphi 等等计算机编程语言,据有非常清晰易读的语法特点,并且是一种高级面向对象的语言 ,用途非常广泛,...

    python-2.6.5-stackless.msi

    Stackless Python 是Python编程语言的一个增强版本,它使程序员从基于线程的编程方式中获得好处,并避免传统线程所带来的性能与复杂度问题。Stackless为 Python带来的微线程扩展,是一种低开销、轻量级的便利工具,...

    放弃 Python 转向 Go语言有人给出了 9 大理由

    其性能与 Java 或 C++相似。在我们的使用中,Go 一般比 Python 要快 30 倍。以下是 Go 与 Java 之间的基准比较: 原因 2:语言性能很重要 对很多应用来说,编程语言只是简单充当了其与数据集之间的胶水。语言...

    学习数据结构与算法的代码示例,目前提供 Java、Python、Go、C++ 多种语言支持。.zip

    Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势...

    汉诺塔java源码-LangBenchmarks:多种编程语言的性能基准

    用多种编程语言编写了两个性能测试,并比较了它们的计算速度。 循环测试 该测试评估了带有 while 子句的变量迭代的简单循环中的代码速度。 def cycle ( n ): i = 0 while i < n : i += 1 河内测试 测试扩展递归以...

    Java数据结构与算法

    介绍了计算机编程中使用的...《Java数据结构和算法》(第2版)提供了学完一门编程语言后进一步需要知道的知识。本书所涵盖的内容通常作为大学或学院中计算机系二年级的课程,在学生掌握了编程的基础后才开始本书的学习。

    算法图解的算法代码示例,用Python和Java实现,后期会加入其它语言.zip

    Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势...

    Python SQLAlchemy操作实例

    SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行。 SQLAlchemy“采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”...

    python课后题及答案-python全书课后习题答案.doc

    以简 单的方式快速完成某些复杂的事情通常是创造脚本语言的重要原则,基于这项原则,使 得脚本语言通常比 C语言、C++语言 或 Java 之类的系统编程语言要简单容易。 也让脚本语言另有一些属于脚本语言的特性: 语法和...

    python-3.1.2-stackless.msi

    Stackless Python 是Python编程语言的一个增强版本,它使程序员从基于线程的编程方式中获得好处,并避免传统线程所带来的性能与复杂度问题。Stackless为 Python带来的微线程扩展,是一种低开销、轻量级的便利工具,...

Global site tag (gtag.js) - Google Analytics