Python có quá chậm để sử dụng phía máy khách trong Trình duyệt không?


17

Tôi đã nghe tuyên bố rằng Python sẽ quá chậm để sử dụng trong các trình duyệt.

Tôi cho rằng Javascript chỉ vượt trội ở khía cạnh này vì các công ty như Google cần nó nhanh (và làm cho nó nhanh) vì họ cần nó để tồn tại, nhưng tôi có thể sai.

Có sự khác biệt nào trong cách Python và Javascript được thiết kế có ảnh hưởng đến cách chúng (sẽ) hoạt động trong trình duyệt không?

Vì hiện tại không có triển khai Python phía máy khách, câu hỏi của tôi xuất phát từ tuyên bố của ai đó, vì vậy có lẽ nó có liên quan đến chính ngôn ngữ (mặc dù tôi không tin điều đó).


2
Python trong trình duyệt? Điều đó xảy ra khi nào?
yannis

6
Nó đã không. Thông báo would?
Profpatsch

16
Chà, nếu nó không xảy ra, thì tôi không thấy câu hỏi đó là gì. Khi chúng ta đang nói về hiệu suất, chúng ta không nói về ngôn ngữ, mà là về việc triển khai ngôn ngữ (và một số triển khai tồn tại cho Python cũng như đối với Javascript). Nếu không có triển khai Python phía máy khách, thì có gì để nói?
yannis

1
Khoa học lý thuyết! : D Câu hỏi của tôi xuất phát từ tuyên bố của ai đó, vì vậy có lẽ nó có liên quan đến chính ngôn ngữ (mặc dù tôi không tin điều đó).
Profpatsch

1
Đã từng có một triển khai tích hợp Python cho Internet Explorer, thông qua giao diện COM cũng cho phép tùy chọn VBScript để kịch bản DOM. Tôi nghĩ rằng MS đã ngừng tùy chọn sử dụng tích hợp COM trong phiên bản 5 hoặc 6, không thể nhớ lại.
Martijn Pieters

Câu trả lời:


23

Để bắt đầu, chúng ta phải phân biệt rõ ràng giữa các ngôn ngữviệc triển khai . Một ngôn ngữ là một điều trừu tượng, việc thực hiện là một điều cụ thể có thể đo lường hiệu suất. Ví dụ, Lisp từng được coi là quá kém hiệu quả đối với việc sử dụng thực tế nhưng trình biên dịch tiếp tục hoàn thiện và cuối cùng, phần cứng chuyên dụng đã được phát triển cho nó; tại một thời điểm trong những năm 1980, nó là nền tảng phát triển được lựa chọn để phát triển máy trạm hiệu suất cao.

Điều đó nói rằng, câu trả lời đơn giản nhất là việc triển khai Javascript nhanh như V8 của Google đã thổi bay việc triển khai Python (CPython) tiêu chuẩn ra khỏi nước . V8 là một máy ảo được tối ưu hóa cao với JITer có tốc độ nhanh đáng kinh ngạc trong khi CPython là một VM khá đơn giản so với. Có một triển khai Python với JIT nhưng nó vẫn chỉ nhanh hơn khoảng 5-6 lần.

Năm năm trước đây sẽ là một câu chuyện khác nhau. Các trình duyệt đã triển khai Javascript đơn giản vì tốc độ không phải là vấn đề đáng lo ngại vì không ai xây dựng phần mềm 'thực' với nó và Python sẽ bằng nhau, nếu không nhanh hơn.


Đây là câu trả lời sâu sắc nhất chưa. Vì vậy, nó không tiềm năng, thay vào đó là thời gian và tiền bạc.
Profpatsch

7
"Năm năm trước đây sẽ là một câu chuyện khác" ... và năm năm nữa, nó có thể lại khác.
Bryan Oakley

1
>> Ngôn ngữ là một thứ trừu tượng, việc triển khai là một thứ cụ thể có thể đo lường hiệu suất. << Vâng, việc thực hiện ngôn ngữ lập trình là một điều cụ thể. Không, việc triển khai ngôn ngữ lập trình không có hiệu suất thuộc tính có thể đo lường được. Hiệu suất là một tài sản của các chương trình cụ thể sử dụng ngôn ngữ thực hiện, trong một bối cảnh cụ thể.
igouy

2
@igouy Vì vậy, nếu tôi viết hai chương trình giống nhau về chức năng, một bằng C và một bằng Python, bạn sẽ coi sự khác biệt về hiệu năng là một thuộc tính của ứng dụng chứ không phải là ngôn ngữ thực hiện?
Điều

1
@ConditionRacer: Có nhiều cách viết khác nhau cho cùng một chương trình, vì vậy ngay cả khi phiên bản python của chương trình có các đặc tính hiệu suất khác với phiên bản C, điều đó sẽ không chứng minh rằng không có phiên bản python nào có thể tương đương với phiên bản C. Xem những thứ như asm.js ... bằng bất kỳ ngôn ngữ nào bạn có thể sử dụng một mảng khổng lồ để lưu trữ tất cả trạng thái của chương trình và có thể sử dụng một tập hợp con dễ dàng tối ưu hóa các hoạt động nguyên thủy của ngôn ngữ. (Như họ nói "bạn có thể viết C bằng bất kỳ ngôn ngữ nào".)
Mankude

5

Trong thời kỳ cũ của web, khi các applet java có dạng nội dung tương tác chính của máy khách, mọi người nhận ra rằng cần phải có một cách để lấy các biểu mẫu trên một trang web để có thể tương tác với các applet trên trang web.

Từ đó, một ngôn ngữ kịch bản để liên kết các applet java với trang web đã được tạo với tên ... javascript.

Mọi người có thể thấy các dấu tích của di sản này với các câu hỏi SO như [ 1 ], [ 2 ], [ 3 ] - và hai tài liệu chính thức: Gọi mã JavaScript từ một ứng dụnggọi các phương thức ứng dụng từ mã JavaScript

Với ngôn ngữ có sẵn như vậy, các trình duyệt thời đó (Netscape là ngôn ngữ chiếm ưu thế) đã tạo ra javascript như một lợi thế cạnh tranh (javascript được thiết kế tại Netscape - Netscape là javascript phía máy chủ đầu tiên có máy chủ trở lại vào năm '94 - gần hai thập kỷ trước nút .js). Các trình duyệt khác theo sau phù hợp. Mọi người đang viết các trang sử dụng javascript, các nỗ lực khác trong kịch bản phía máy khách có nghĩa là các trang hoàn toàn không thể so sánh giữa những thứ hoạt động và những thứ không - hoặc sao chép mã (ở đây là {chèn ngôn ngữ ở đây} để thực hiện điều này không phải là javascript trình duyệt và đây là khối javascript cho những người khác).

Vì Netscape là trình duyệt thống trị trong một khoảng thời gian, javascript đã được giữ vững. Mặc dù di sản của Netscape bị mất theo chú thích của các tệp nguồn của Mozilla, nhưng javascript vẫn tồn tại và không có gì có thể vượt qua được vị trí của nó.

Vấn đề vẫn còn cho bất kỳ ngôn ngữ kịch bản slide khách hàng khác. Javascript được hỗ trợ trên mọi trình duyệt. Nếu một người tạo một trình duyệt hỗ trợ python (ví dụ) chứ không phải javascript, thì nó sẽ không thể sử dụng phần lớn các trang web. Hơn nữa, trừ khi trình duyệt đó có thể nhận được một phần lưu lượng truy cập trình duyệt đáng kể, các nhà thiết kế web không muốn tạo hai bộ trang với các ngôn ngữ kịch bản khác nhau cho cùng một trang.

Người ta có thể thử tạo một plugin kịch bản python cho một số trình duyệt kích hoạt tập lệnh python trên trang ... giống như cách vrml hoạt động ngày nay. Nhưng trừ khi bạn đã nghe và thấy một trang web sử dụng vrml, người ta cũng có khả năng tìm thấy việc sử dụng cho một trang web khác cho ngôn ngữ kịch bản lệnh khác.


1
Đây là một tổng quan rất hay về cách thức mà Vượt qua nó, và tôi muốn đánh dấu nó là câu trả lời đúng, nó trả lời câu hỏi Tại sao Javascript là ngôn ngữ phía máy khách được sử dụng ngày hôm nay? có một vấn đề thiết kế mà có thể làm Python quá chậm để sử dụng client-side “?
Profpatsch

VRML ... wow đưa tôi trở lại!
Thất vọngWithFormsDesigner

1
@Profpatsch không có vấn đề thiết kế kỹ thuật nào với javascript khiến nó không phù hợp để trở thành ngôn ngữ phía máy khách - ngoài việc không có gì sử dụng nó và trừ khi nó mang lại một số lợi thế đáng kể (có thể bao gồm cả khả năng tương tác với các applet java), sẽ không có gì. Các vấn đề không phải là kỹ thuật và trừ khi người ta hiểu lịch sử của "tại sao javascript", người ta không thể trả lời "tại sao không phải là trăn".

2
@MichaelT: Bạn đã viết "không có vấn đề thiết kế kỹ thuật nào với javascript khiến nó không phù hợp để trở thành ngôn ngữ phía máy khách". Ý bạn là Python không phải là ??
Carl Smith

@CarlSmith À đúng rồi. Lỗi của tôi ... và tôi không thể chỉnh sửa bình luận sau một thời gian nhất định. Cảm ơn bạn đã sửa chữa.

4

Tôi không nghĩ Python sẽ quá chậm. Không có gì về ngôn ngữ ngăn nó chạy đủ nhanh để ít nhất khớp với JavaScript. Nó có thể được biên dịch thành JavaScript, vì vậy, nếu không có gì khác, bạn có thể bao gồm một trình biên dịch trong trình duyệt và chỉ có khả năng tăng thời gian tải trang.

CẬP NHẬT: Vui lòng xem các bình luận bên dưới thảo luận về lý do tại sao biên dịch Python thành JS sẽ tốn kém hơn đáng kể so với ngụ ý ở đây.

Vấn đề là cố gắng thuyết phục các nhà cung cấp trình duyệt và W3C trước tiên chọn Python, qua Ruby hoặc bất kỳ ngôn ngữ kịch bản hay nào khác, sau đó xác định một tập hợp con được tiêu chuẩn hóa, vì họ không thể cho phép các cuộc gọi hệ thống, v.v. vẫn hỗ trợ JavaScript. Điều đó sẽ không xảy ra, nhưng nếu nó xảy ra, tôi nghi ngờ rằng tốc độ sẽ trở thành một vấn đề nghiêm trọng.


7
Điểm đầu tiên của bạn không tuân theo. Mọi thứ có thể được biên dịch thành hầu hết mọi thứ (bao gồm cả mã máy), nhưng điều đó không có nghĩa là một chương trình được viết bằng một ngôn ngữ L và được biên dịch sang một ngôn ngữ C nhanh như một chương trình tương đương được viết bằng ngôn ngữ C.

1
Vâng, CoffeeScript về cơ bản là một cú pháp khác nhau cho cùng các khái niệm cốt lõi như JavaScript và C về cơ bản là một ngôn ngữ lắp ráp di động. Python và Javascript, mặt khác, khác nhau khá nhiều. Để triển khai Python một cách chính xác, bạn cần hỗ trợ (trong số hàng tỷ thứ khác) mô hình lớp, quá tải toán tử, siêu dữ liệu, v.v. và hầu hết điều đó không ánh xạ tới JavaScript một cách dễ dàng và hiệu quả. Cùng một vấn đề với việc biên dịch một trong số chúng thành C hoặc mã máy. Một JIT chuyên biệt có thể là hy vọng duy nhất của bạn, nhưng trình biên dịch JIT nhắm mục tiêu vào JS vẫn chưa được chứng minh thực tế.

3
Một vấn đề sẽ là thực tế là bạn không thể nén Python như bạn có thể JS - loại bỏ tất cả các khoảng trắng và dòng mới và phạm vi của bạn! Vì vậy, bạn sẽ kết thúc với thời gian tải lâu hơn cho bất kỳ khối Python đáng kể nào.
TMN

1
@TMN điểm thú vị, mặc dù người ta hy vọng rằng tính biểu cảm của Python sẽ đi một chặng đường dài để giảm thiểu điều đó (và vâng, đó là đếm các dòng, không phải ký tự, nhưng vẫn là ngôn ngữ khá biểu cảm của Python).
Daniel B

2
@TMN Những gì Daniel B đã nói, và gzip cũng sẽ làm giảm sự khác biệt. Ồ, và Python không cần hầu hết các dòng và khoảng trắng mới đó. Nhiều dòng (mặc dù không phải tất cả) có thể được nối với nhau chỉ tốt trong Python, ví dụ a = something(); frobincate(a); return quuxif condition: react()là mỗi dòng đơn. Và n cấp độ thụt chỉ cần n khoảng trắng, không phải n * 4 khoảng trắng.

2

Tôi nghĩ Python có máy ảo riêng. Tôi không có nhiều kinh nghiệm với Python, nhưng tôi không thấy bất kỳ lý do nào khiến nó không hoạt động tốt như một công cụ JavaScript không được tối ưu hóa.

Một số suy nghĩ ngẫu nhiên:

(1) Bạn có thể có thể chạy Python cục bộ thông qua một applet Java bằng Jython. Điều khó khăn tôi thấy ở đây là các applet rất hạn chế, vì vậy bạn có thể cần phải sửa đổi Jython để phù hợp với các hạn chế truy cập. Ví dụ, nếu nó ghi vào một tệp nhật ký, bạn có thể cần phải xóa mã đăng nhập. Một applet không cần phải nhìn thấy rõ.

(2) Ai đó có thể xây dựng trình biên dịch / trình biên dịch Python-to-JavaScript. Đây sẽ là rất nhiều công việc.


5
Someone could build a Python-to-JavaScript "compiler"/converterVâng, ai đó đã làm .
yannis


Tôi chưa bao giờ phải làm điều này một mình, nhưng tôi biết rằng mọi người đã viết các applet Java bằng Jython. Đó không phải là điều tương tự mặc dù thay thế Javascript trong trình duyệt bằng Python.
Martijn Pieters

Brythonhoạt động nhanh một cách thú vị, ít nhất là cho các phần khá tách biệt trên các trang (tương tác thấp với DOM tree).
Profpatsch

@Profpatsch Từ trạng thái của lần trước tôi nhìn vào, nó thậm chí không triển khai các phần rất lớn của ngôn ngữ Python. Thuận tiện, trong số các tính năng chưa được thực hiện là những tính năng khó triển khai tốt trên đỉnh JavaScript. Để diễn giải một trong những tác giả của PyPy: Thật dễ dàng để tạo một tập hợp con không cần thiết của Python nhanh, Python đầy đủ là nơi nó trở nên khó khăn.

1

Nó phụ thuộc vào việc thực hiện ngôn ngữ và không nhất thiết phải là ngôn ngữ. Hầu hết các trình thông dịch JavaScript nhanh hơn nhiều so với gần như tất cả các triển khai Python.

Điều này không có nghĩa là ngôn ngữ Python không thể được sử dụng ở tốc độ gần như với JavaScript. Opal triển khai gần như toàn bộ ngôn ngữ Ruby và thư viện chuẩn trong trình duyệt bằng cách biên dịch mã Ruby thành mã JavaScript được đóng gói. Đặt chi phí bao gồm cả thư viện Opal, tốc độ của nó gần với JavaScript thẳng hơn bất kỳ trình thông dịch Ruby nào khác mà tôi biết.

Tôi không biết có tương đương với Python của Opal không, nhưng một dự án như vậy có thể có nghĩa là câu trả lời cho câu hỏi của bạn là "không". Với việc sử dụng JavaScript ngày càng nhiều như một "ngôn ngữ lắp ráp cho web", tôi sẽ không ngạc nhiên nếu nó sẽ được sử dụng ngày càng nhiều hơn như một nền tảng cho các ngôn ngữ khác, đặc biệt là khi sức mạnh điện toán di động tăng lên và có thêm ngôn ngữ triển khai trong JavaScript ngày càng trở nên cẩu thả.

EDIT: Đây là danh sách các triển khai Python cho trình duyệt biên dịch / chạy trên JavaScript.

https://github.com/jashkenas/coffeescript/wiki/list-of-lacular-that-compile-to-js#python

Và trong trường hợp bạn quan tâm, bạn có thể kiểm tra Opal, điều mà tôi thực sự thích.

http://opalrb.org/

Vì tôi nghi ngờ rằng các trình duyệt sẽ đi kèm với sự hỗ trợ cho các trình thông dịch riêng biệt, các trình biên dịch như vậy có lẽ là cách của tương lai về mặt sử dụng các ngôn ngữ khác ngoài JavaScript. Ngay cả bây giờ, bạn sẽ có được hiệu suất tương đương trong hầu hết các lĩnh vực. Đây là ý kiến ​​của tôi, tuy nhiên, vì vậy hãy ghi nhớ điều đó.


0

Ngay cả khi bạn hỏi câu hỏi này, đã có một số triển khai python có sẵn trong javascript có thể được sử dụng trên các trang web ngày nay.

Hãy xem http://www.skulpt.org/ hoặc http://www.brython.info/ để bắt đầu.

Hiệu suất dường như không quá tệ, nhưng bạn nên tự kiểm tra chúng và tìm hiểu.


-4

Python là ngôn ngữ "console", chạy trên máy chủ

Javascript là ngôn ngữ "trình duyệt", chạy trên máy khách

Như vậy, họ không cạnh tranh trực tiếp

... tất nhiên là có các plugin trình duyệt node.js và có lẽ là python, nhưng sau đó, đó là câu hỏi về hiệu suất của một triển khai cụ thể.

Hơn nữa, đối với hầu hết các ứng dụng, python sẽ hoạt động tốt, ngoại trừ nếu bạn phải thực hiện một số tính toán mở rộng và vắt kiệt các chu kỳ CPU.

Như một lưu ý cuối cùng, python và javascript có nhiều điểm tương đồng. Do tính chất động của chúng, cả hai phải được giải thích trong thời gian chạy và không thể được biên dịch mạnh như các ngôn ngữ gõ tĩnh. Như vậy, tôi cho rằng hiệu suất có thể đạt được của họ sẽ tương tự nhau.


2
Javascript phía máy chủ là khoảng '94. jsccho phép bạn làm việc với javascript như một bàn điều khiển, giống như bạn sẽ nhận được nếu họ gõ pythonvào bàn điều khiển.

@MichaelT: Ok, tôi đã chỉnh sửa phản hồi của mình cho phù hợp
dagnelies

2
Ngoài ra, bạn có thể viết các ứng dụng máy tính để bàn bằng Python .... Tôi không thấy bất kỳ lý do thực sự nào cho sự khác biệt mà bạn đang thực hiện.
Chris Travers

Ngoài ra, công cụ lập mô hình 3D Blender sử dụng Python cho mọi thứ từ giao diện người dùng đến tạo lưới. Nếu đó không phải là cạnh tranh thực sự, thì là gì?
Andrew Gray

@Chris: điểm khác biệt là javascript là công nghệ trình duyệt là chủ yếu, trong khi python chủ yếu là công nghệ máy tính để bàn / bàn điều khiển. Quan điểm của tôi là so sánh cả hai đều không có ý nghĩa gì vì chúng phục vụ các mục đích hoàn toàn khác nhau.
dagnelies
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.