使用Java可以完成哪些事情而不是Python?

时间:2011-02-26 10:26:28

标签: java python programming-languages

我想选择一种新的编程语言--Java,已经使用Python一段时间了。但似乎大多数可以用Java完成的事情都可以用Python完成。所以我想知道

  1. 使用Java可以完成哪些事情而不是Python?
    • 移动节目(Android)。
    • POSIX线程编程。
  2. 相反,使用Python可以做什么样的事情而不是Java呢?
  3. 澄清: 我希望从实际的角度得到答案,但不是理论观点,它应该是关于当前的状态,而不是未来。因此理论上所有编程语言都可以执行任何任务,实际上每个都受到某些限制。

5 个答案:

答案 0 :(得分:12)

两种语言都是图灵完备的,都有大量的库,并且都支持用C语言编写的扩展,以便您可以根据需要访问低级代码。主要区别在于它们目前受支持的位置。 Java通常比Python有更广泛的支持。

Android的例子是Java是标准选择的地方,尽管Python也以Android Scripting Environment的形式提供了一些支持。 Java已经安装在大多数家用计算机上。您可以编写Java小程序,并期望它们可以在大多数浏览器中运行。

在Java中你不能轻易做的一件事是快速编写执行有用任务的短脚本。 Python比Java更适合编写脚本(当然也有其他选择)。

答案 1 :(得分:4)

我想使用Jython,你可以用Python做任何事情。你可以用Java做。

相反,Python有PyPy编译器,非常酷 - 一个有多个支持的虚拟机(Java运行时,LLVM,.net和Python IIRC),多个垃圾收集器,多个实现(Stackless)等等。我知道Java有很多虚拟机可供选择,但PyPy的发展令人惊叹,因为它是用RPython编写的 - 一种相当高效的语言。

此外,Java可以在1个文件中执行此操作,少于20行,没有库导入吗?显然,这两种语言都有可以做到这一点的库,但我只是谈论语言的灵活性。

class Logger(object): # boilerplate code
    def log(self,level,msg,*args,**kwargs): # *args, **kwargs = flexible arguments
        self._log(level,msg,*args,**kwargs) # call with flexible argments

    def _log(self,level,msg,*args,**kwargs):
        # override me at runtime :) 
        # I think Java people call this Dependency Runtime Injection
        if level>1:
            print msg,args,kwargs

logger = Logger() # boilerplate code

def logged(level): # what pattern do you call this?
    def logged_decorator(function): # and this? 
        def func(*args,**kwars): 
            name = func.__name__ # look ma, reflective metaprogramming!
            logger.log(level,name,*args,**kwargs)
            return func(*args,**kwargs)
        return func # boilerplate code
    return logged_decorator # boilerplate code

使用示例:

@logged
def my_func(arg1,arg2):
   # your code here
   pass

答案 2 :(得分:2)

你肯定会阅读下面这两种语言之间的比较 检查一下:

答案 3 :(得分:1)

Python不能做到Java不能做到的事情-

没事。

Java可以做什么,但是Python不能-

  • Java是多线程老板。因此,如果您尝试编写一个Web服务器,其中同时有多个请求,则Java可以生成多个线程并由CPU交换它们。这就是几乎所有大公司(Expedia,LinkedIn,高盛,亚马逊,Netflix,CITY,JPMC,VISA几乎所有)都将JVM Web服务器用于其主要应用程序的原因。

CPython有一个叫做GIL的东西,它阻止了它自己有效地使用OS级线程。那么Python应用程序服务器(Gunicorn,Django ..)如何工作?好吧,他们派生了新的进程而不是线程。线程是轻量级的,因此派生新进程而不是线程仍然可以工作到一个阈值,但不是一个非常可扩展的解决方案。

  • 纯粹的执行速度-当您使var a = 1,然后执行a = 10.07时,您只是将float值存储在以前存储整数的变量中。当为变量分配一个新值后,在内部,Python将创建一个新对象来存储该值。然后将此指针分配给变量,这称为动态绑定。动态绑定(Python)比静态绑定(Java)慢-因为它需要创建对象。 Java或C / C ++基本类型由于静态绑定而快一个数量级。

  • 已用空间(RAM使用)-python用于存储变量的默认空间很大。

>>> import math, sys
>>> a=0
>>> sys.getsizeof(a)
24

但是在Java中,您可以使用Byte size变量,该变量仅需要一个字节。因此,如果要求编写内存效率高的软件,那么没人会用Python编写应用程序(想想您需要创建一个像Cassandra这样的数据库,也许要设计一个像Spark这样的计算引擎)。

  • 包装-在Java中,您可以创建类似Jar的东西。它可以在安装了JVM的任何计算机上运行。并且该JAR包含所有依赖项。在python中,您不仅可以发布JAR之类的东西,还必须编写脚本以在要在其上运行代码的每台计算机上安装依赖项。

考虑一下Android是否是Python应用程序,在从Play商店安装应用程序之前,您必须单独安装该应用程序的依赖项。

Java的效率主要来自其即时(JIT)编译器和对并发的支持。 JIT编译器是Java运行时环境的一部分。通过将字节码“及时”编译为本地机器代码来提高Java程序的性能。 Java虚拟机(JVM)直接调用已编译的代码。由于未解释代码,因此编译不需要处理器时间和内存使用。从理论上讲,这可以使Java程序与本地应用程序一样快。

虽然直接编译Java程序,但会解释Python,这会在运行时降低Python程序的速度。确定在运行时发生的变量类型会增加解释器的工作量。另外,记住从容器对象中检索到的对象的对象类型有助于内存使用。

我们可以继续下去...

人们使用python是因为python易于学习,易于使用。大量的ML / DataScience等库。这样可以节省您的编码。但是,如果要求您编写高性能,可伸缩,耐用,长期的应用程序,那么了解comp sci的人将始终选择Java或C / C ++

答案 4 :(得分:-1)

CPython有很多库与本机库绑定 - 而不是Java。