(来源: mycsharp.de)
这个柱状图显示了结果。Python是明显的赢家。据我所知,Python使用Karatsuba算法来乘以大整数,这解释了速度。
此外,Python的“任意精度整数”类型是内置的long
。因此,您甚至不需要为Java的BigInteger类所需的特殊类型处理。
简单来说,Python很慢。
无论你使用哪个解释器(目前可用),它都比Java和C慢。在各种基准测试中,它比Ruby和PHP还要慢。 不要依赖别人的答案,自己检查和验证。
就我个人而言,我认为在使Python更快的问题上并没有做出很多严肃的贡献和开发工作。由于Python的生产力非常高,并且能够直接解决某些问题,因此速度/性能并没有得到严肃对待。还存在一些架构问题,阻碍了Python的性能提升。
免责声明 - 这个答案可能会伤害Python爱好者。我也是Python开发人员,在Django / Flask / Pyramid中开发Web应用程序,而不是Spring(Java)。但是根据我的工作和经验,我看到了Python有多么慢。速度并不总是我的首要考虑因素。但我会支持那些认为Python解释器应该得到润滑和加油或彻底更换引擎,至少能够参加马拉松比赛的人们。它是一种主流编程语言。
如评论中建议的那样,您应该提供一个测试用例来推理。性能差异背后的原因将根据执行的测试而变化。
然而,我认为静态与动态性质可能有很大关系。对于非虚拟调用,JIT编译的C# / Java非常便宜,因为它可以在JIT时间准确确定。即使是虚拟调用也只涉及单级重定向。当绑定变得动态时,需要考虑更广泛的事情。
我不知道Python的细节足够多,无法声称理解其精确的运行时行为,我怀疑这也可能随版本和实现的不同而有所变化。有一种名为"python字节码"的东西,然后由虚拟机执行 - 这个虚拟机是否实际上执行JIT编译还是另一回事。
问题在于编译阶段可用的信息较少,因此在动态类型语言中运行时需要更多的工作。这意味着如果我正在进行方法调用foo.bar(),在Java或C++中,通过发现"foo"的类型,可以在编译过程中优化对bar的调用,并直接调用编译器知道将找到的方法的内存位置。由于python或任何其他动态类型语言的编译器不知道foo对象属于哪种类型,因此必须在运行时进行类型检查,然后查找bar方法的地址并执行它。
还有其他困难使python编译器编写者感到苦恼,尽管上面的一个问题希望足够表明情况。因此,即使是最好的编译器编写者,静态类型语言在运行时也很可能表现更好。
动态类型语言的优势通常在于开发时间。由于需要编写和维护的代码行数较少,并且没有开发人员的编译等待时间,因此开发速度通常更快。
你所看到的是使用Python编写Java的明显例子:
def __init__(self,size):
self.first = None
last = None
for i in range(size):
current = Person(i)
if self.first == None : self.first = current
if last != None :
last.next = current
current.prev = last
last = current
self.first.prev = last
last.next = self.first
一种更具Python风格的写法: def __init__(self,size):
chain = [Person(i) for i in range(size)]
self.first = chain[0]
chain = zip(chain, chain[1:].append(chain[0]))
for p,n in chain:
p.next = n
n.prev = p
这与编程语言本身无关,只是因为Java的实现和JVM(运行时系统)非常高质量,并且多年来已经投入了大量资源来提高稳定性、可扩展性和性能。
相比之下,CPython实现最近才在其解释器中实现了线程分派,从而为某些问题带来了高达20%的性能提升。这并不是好事,因为这种基本的优化应该从一开始就存在。