对于浏览器中的客户端而言,Python会太慢吗?


17

我听到过这样的说法:Python太慢了,无法在浏览器中使用。

我认为JavaScript仅在这方面具有优势,因为Google之类的公司之所以需要它(并且使其变得很快)是因为他们需要它才能生存,但是我可能错了。

Python和Javascript的设计方式是否存在差异,从而影响它们(将)在浏览器中的执行方式?

由于到目前为止还没有客户端Python实现,所以我的问题来自某人发表的声明,因此也许它与语言本身有关(尽管我不相信)。


2
浏览器中的Python?什么时候发生的?
yannis 2013年

6
没有。请注意would
Profpatsch 2013年

16
好吧,如果这没有发生,那么我看不出问题的根源。当我们谈论性能时,我们不是在谈论语言,而是在谈论语言的实现(Python和Javascript都存在几种实现)。如果没有客户端Python实现,那么该谈论什么呢?
yannis 2013年

1
理论科学!:D我的问题来自某人的陈述,所以也许这与语言本身有关(尽管我不相信)。
Profpatsch 2013年

1
曾经有一个通过COM界面用于Internet Explorer的Python集成实现,该实现还启用了VBScript选项来编写DOM脚本。我想MS不能再选择使用版本5或6中的COM集成的选项了。
马丁·彼得

Answers:


23

首先,我们必须明确区分语言实现。语言是抽象的事物,实现是可以衡量性能的具体事物。例如,Lisp曾经被认为对于实际使用而言效率太低,但是编译器不断成熟,最终为它开发了专用硬件。在1980年代的某一时刻,它是高性能工作站开发的首选开发平台。

就是说,最简单的答案是,像Google的V8这样的快速Javascript实现将Python(CPython)的标准实现引人注目。V8是带有JITer的高度优化的虚拟机,而JITer的速度惊人地快,相比之下CPython是相当简单的VM。使用JIT实现了Python的实现,但仍仅快5-6倍。

五年前,情况将完全不同。浏览器的Javascript实现过于简单,因为速度不是问题,因为没有人用它构建“真正的”软件,而Python甚至可以更快地实现。


这是迄今为止最有见地的答案。因此,这不是潜力,而是时间和金钱。
Profpatsch 2013年

7
“五年前这将是一个不同的故事”……而从现在开始的五年后,情况可能又会有所不同。
布莱恩·奥克利

1
>>语言是抽象的东西,实现是可以衡量性能的具体事物。<<是的,编程语言的实现是具体的事物。不,编程语言实现没有可测量的性能。性能是在特定上下文中使用语言实现的特定程序的属性。
igouy

2
@igouy所以,如果我要编写两个功能相同的程序,一个用C编写,一个用Python编写,那么您会认为性能差异是应用程序的属性,而不是语言实现?
ConditionRacer

1
@ConditionRacer:编写同一程序的方式有很多,因此,即使该程序的python版本与C版本具有不同的性能特征,也无法证明没有python版本可以等同于C版本。以任何一种语言查看诸如asm.js之类的东西……您都可以使用巨型数组来存储程序的所有状态,并且可以使用该语言的原始操作的一个易于优化的小的子集。(正如他们所说的“您可以用任何语言编写C”。)
Mankarse 2014年

5

在Web的较早时期,当Java applet 成为客户端交互内容的主要唯一形式时,人们意识到需要有一种在网页上获取表单的方法,以便能够与网页上的applet进行交互。

由此,创建了将Java小程序链接到网页的脚本语言,其名称为... javascript。

可以看到带有[ 1 ],[ 2 ],[ 3 ] 等SO问题的遗留痕迹,以及两个官方文档:从Applet调用JavaScript代码从JavaScript代码调用Applet方法

有了这样一种可用的语言,当时的浏览器(Netscape是主要的浏览器)使javascript成为一种竞争优势(在Netscape上设计的 javascript -Netscape是最早的服务器端javascript,其服务器可追溯到94年-距节点大约二十年前.js)。其他浏览器也紧随其后。人们编写的页面使用的是javascript,其他尝试进行客户端脚本编写的页面则意味着工作正常的页面与无效的页面之间完全不兼容-或代码重复(此处的{insert language here}块可对非javascript执行此操作浏览器,这里是其他所有人的javascript块)。

由于Netscape在一段时间内是主要的浏览器,因此javascript占据了上风。尽管Netscape的遗留物被遗忘在Mozilla的源文件的脚注中,但是javascript仍然存在,并且没有任何东西可以取代它。

对于任何其他客户端幻灯片脚本语言,问题仍然存在。每个浏览器都支持Javascript。如果要制作一个支持python(例如)而不是javascript的浏览器,它将无法使用绝大多数网站。此外,除非该浏览器能够获得相当大的浏览器流量份额,否则Web设计人员不希望为同一页面创建两组具有不同脚本语言的页面。

有人可能会尝试为某些启用了页面上的python脚本的浏览器制作一个python脚本插件,类似于vrml如今的工作方式。但是,除非您听说过使用vrml的网页,否则可能会发现另一网页使用了另一种脚本语言。


1
这是“如何通过……”的很好的概述,我想将其标记为正确答案,它回答了“为什么今天的客户端语言使用Javascript?”而不是“有没有一个设计问题会使Python在客户端使用时太慢?”
Profpatsch 2013年

VRML ...哇,这让我回来了!
FrustratedWithFormsDesigner 2013年

1
@Profpatsch javascript没有技术上的设计问题,使其不适合用作客户端语言-除此之外,没有任何使用它,除非它提供了一些显着的优势(可能包括与Java applet的交互性),否则将一无所获。这些问题不是技术问题,除非人们了解“为什么使用JavaScript”的历史,否则就无法回答“为什么不使用python”。

2
@MichaelT:您写道“ JavaScript没有技术设计问题,因此不适合用作客户端语言”。你的意思是Python不是JS?
卡尔·史密斯

@CarlSmith啊,是的。我的错...我无法在特定时间后编辑评论。谢谢你的纠正。

4

我认为Python不会太慢。没有什么语言可以阻止它运行得足够快以至于至少不能匹配JavaScript。可以将其编译为JavaScript,因此,如果没有其他问题,您可以在浏览器中包含编译器,并且仅可能增加页面加载时间。

更新:请参阅下面的评论,讨论为什么将Python编译为JS比此处暗示的要昂贵得多。

问题是试图说服浏览器供应商和W3C首先选择Ruby,而不是Ruby或任何其他不错的脚本语言,然后定义一个标准化的子集,因为它们不允许系统调用等等,然后一直很好地实现仍支持JavaScript。那不会发生,但是如果真的发生了,我怀疑速度会变成一个严重的问题。


7
您的第一点没有跟进。一切都可以被编译到几乎一切(包括机器代码),但是,这并不意味着在写一些语言L和编译一些C语言程序是尽可能快地写在C语言的等价程序

1
好吧,对于与JavaScript相同的核心概念,CoffeeScript本质上是一种不同的语法,而C本质上是一种可移植的汇编语言。另一方面,Python和Javascript相差很多。为了正确地实现Python,您需要(在数十亿其他事物中)支持类模型,运算符重载,元类等,并且其中大多数不能轻松高效地映射到JavaScript。将它们都编译为C或机器代码也存在同样的问题。专门的JIT可能是您唯一的希望,但是针对JS的JIT编译器尚未被证明是可行的。

3
一个问题将是您无法像JS一样压缩Python-消除所有这些空格和换行符,然后进行范围界定!因此,对于任何重要的Python块,您将需要更长的加载时间。
TMN

1
@TMN有趣的一点是,尽管人们希望Python的表现力可以大大缓解这一问题(是的,这是在计算行数,而不是字符,但Python是一种相当有表现力的语言)。
丹尼尔·B

2
@TMN Daniel B所说的话,还有gzip应该减少差别。哦,Python不需要大多数这些新的行和空格。许多(尽管不是全部)行可以在Python中很好地连接在一起,例如a = something(); frobincate(a); return quuxif condition: react()每行都是一行。n个缩进级别仅需要n个空格,而不需要n * 4个空格。

2

我认为Python有自己的虚拟机。我没有使用Python的丰富经验,但是我看不出没有任何理由无法像未优化的JavaScript引擎那样表现出色。

一些随机的想法:

(1)您可能可以使用Jython通过Java小程序在本地运行Python。我在这里看到的困难部分是applet的限制非常严格,因此您可能需要修改Jython使其适合访问限制。例如,如果它写入日志文件,则可能需要删除日志记录代码。小程序不需要明显可见。

(2)有人可以构建一个Python到JavaScript的“编译器” /转换器。这将是很多工作。


5
Someone could build a Python-to-JavaScript "compiler"/converter好吧,已经有人做过了
yannis 2013年


我从来没有自己做这个,但是我知道有人用Jython编写Java applet。尽管这与用Python替换浏览器中的Javascript 是不一样的
马丁·彼得

Brython有趣的是,它的运行速度非常快,至少对于页面上相当孤立的部分(与的互动度较低DOM tree)。
Profpatsch 2013年

@Profpatsch从我上次查看它的状态来看,它甚至没有实现Python语言的很大一部分。方便地,在未实现的功能中,有一些很难在JavaScript之上很好地实现的功能。解释一位PyPy的作者:快速创建一个重要的Python子集很容易,而完整的Python则使它变得困难。

1

它取决于语言的实现方式,不一定取决于语言本身。大多数JavaScript解释器比几乎所有Python实现都要快得多。

这并不意味着Python语言的使用速度几乎不能与JavaScript相同。Opal通过将Ruby代码编译成封装在闭包中的JavaScript代码,在浏览器中几乎实现了完整的Ruby语言和标准库。除了包括Opal库的开销外,它的速度比我所知的任何其他Ruby解释器都快得多,比纯JavaScript更快。

我不知道是否有Python等同于Opal,但是这样的项目可能意味着您的问题的答案为“否”。随着JavaScript作为“ Web汇编语言”的使用越来越多,如果将它越来越多地用作其他语言的平台,这也就不足为奇了,尤其是随着移动计算能力的提高以及使用该语言的开销用JavaScript实现的错误越来越严重。

编辑:这是针对在JavaScript上编译/运行的浏览器的Python实现的列表。

https://github.com/jashkenas/coffeescript/wiki/list-of-languages-that-c​​ompile-to-js#python

如果您有兴趣,可以查看我真正喜欢的Opal。

http://opalrb.org/

由于我怀疑浏览器是否会支持单独的解释器,因此就使用JavaScript以外的语言而言,此类编译器可能是未来的方式。即使是现在,您仍将在大多数领域获得可比的性能。但是,这是我的观点,因此请记住这一点。



-4

Python是一种“控制台”语言,在服务器上运行

Javascript是一种“浏览器”语言,在客户端上运行

因此,他们不会直接竞争

...当然有node.js以及可能的python浏览器插件,但这是一个关于特定实现的性能的问题。

而且,对于大多数应用程序,python都可以正常工作,除非您必须进行某种形式的大量计算并减少CPU周期。

最后一点,python和javascript有很多相似之处。由于它们的动态性质,两者都必须在运行时进行解释,并且不能像静态类型的语言一样强大地进行编译。因此,我认为它们可以实现的性能是相似的。


2
服务器端javascript出现在94年。 jsc可让您将javascript用作控制台,就像python在控制台上键入javascript一样。

@MichaelT:好的,我相应地编辑了我的回复
dagnelies

2
您也可以用Python编写桌面应用程序。...我看不出您要与众不同的任何真正原因。
克里斯·特拉弗斯

此外,3D建模工具Blender使用Python进行从UI到网格生成的所有操作。如果这在性能上没有竞争力,那是什么?
安德鲁·格雷

@Chris:区别在于javascript主要是浏览器技术,而python主要是桌面/控制台技术。我的观点是,将两者进行比较没有什么意义,因为它们具有完全不同的目的。
dagnelies
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.