我想选择一种新的编程语言--Java,已经使用Python一段时间了。但似乎大多数可以用Java完成的事情都可以用Python完成。所以我想知道
澄清: 我希望从实际的角度得到答案,但不是理论观点,它应该是关于当前的状态,而不是未来。因此理论上所有编程语言都可以执行任何任务,实际上每个都受到某些限制。
答案 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不能-
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这样的计算引擎)。
考虑一下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。