Python trong Trình duyệt: Làm thế nào để chọn giữa Brython, PyPy.js, Skulpt và Transcrypt?


89

Tôi rất vui mừng khi thấy rằng bây giờ có thể viết mã Python trong trình duyệt. Đây là những ứng cử viên chính (vui lòng thêm bất kỳ điều gì tôi có thể đã bỏ qua):

Nhưng làm thế nào để lựa chọn giữa chúng? Sự khác biệt rõ ràng duy nhất tôi có thể thấy là Skulpt dựa trên Python 2, trong khi Brython dựa trên Python 3.

Xin lưu ý: Đây không phải là yêu cầu đề xuất hoặc ý kiến. Tôi đang tìm kiếm sự thật khách quan có thể thông báo cho một lựa chọn có học thức


6
Yêu cầu chúng tôi giới thiệu thư viện tốt nhất cho một thứ gì đó là một trong những trường hợp mà trợ giúp giải thích rõ ràng rằng StackOverflow không phù hợp. Đó là một câu hỏi tuyệt vời, không chỉ dành cho định dạng của trang web này; bạn có thể muốn một cái gì đó dựa trên thảo luận, như danh sách gửi thư hoặc diễn đàn.
abarnert

2
Transcrypt ( transcrypt.org ) biên dịch từ một tập hợp con lớn của python3.5 inc. đa kế thừa, tạo mã nhanh (ghi nhớ cuộc gọi), mã nhỏ, có thể đọc được, hỗ trợ bản đồ nguồn đa cấp và có thể sử dụng bất kỳ JS lib nào mà không cần điều chỉnh. Disclaimer: Tôi đã viết nó.
Jacques de Hooge,

1
Xin chào fzzylogic, tôi đã thêm thẻ, vì vậy bây giờ mọi người có thể đặt câu hỏi về SO bằng cách sử dụng nó. Đã thay thế thẻ JS bởi nó, vì nó là thẻ ít có khả năng tìm kiếm nhất nếu bạn muốn sử dụng Python trong trình duyệt.
Jacques de Hooge

1
Tôi đã viết một loại hướng dẫn về Transcrypt cho người mới bắt đầu. Bạn có thể xem nó tại github.com/bunkahle/Transcrypt-Examples/blob/master/alerts/…github.com/bunkahle/Transcrypt-Examples/blob/master/cookies/…
bunkus

1
Câu trả lời bị xóa bởi dstromberg với 27 phiếu ủng hộ có một liên kết so sánh tốt đẹp: stromberg.dnsalias.org/~strombrg/pybrowser/python-browser.html
Cees Timmerman

Câu trả lời:


26

Chạy Python trong Trình duyệt là một bài viết thực sự hay và cập nhật (tính đến năm 2019) so sánh Brython, Skulpt, PyPy.js, Transcrypt, Pyodide, Batavia . Tôi rất khuyên bạn nên đọc nó.

Một bản tóm tắt tốt có thể được nhìn thấy trong các hình ảnh sau đây.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


61

Đây là một số thông tin về Brython vs Transcrypt (tháng 7 năm 2016, vì Transcrypt đã được OP thêm vào làm tùy chọn cho câu hỏi này), thu thập được bằng cách bắt đầu một dự án với Brython vài tháng trước và chuyển sang Transcrypt (đã hoàn thành việc chuyển vào tuần trước). Tôi thích Brython và Transcrypt và có thể thấy công dụng của cả hai.

Đối với những người chưa quen với điều này, Brython và Transcrypt đều 'chuyển đổi' đầu vào python thành javascript (Chỉnh sửa: có lẽ tốt hơn nên xem Brython là 'triển khai Python cho trình duyệt' vì nó không tạo ra javascript độc lập). Cả hai đều yêu cầu cú pháp Python 3. Brython bao gồm một số lượng đáng kể các thư viện chuẩn Python và một số thư viện riêng để xử lý những thứ liên quan đến web, trong khi Transcrypt tránh điều đó phần lớn và đề xuất sử dụng các thư viện Javascript để thay thế.

Brython ( Github) có thể thực hiện chuyển đổi trong trình duyệt. Vì vậy, bạn viết bằng python và công cụ brython.js chuyển đổi nó thành javascript ngay lập tức khi trang được tải. Điều này thực sự tiện lợi và nhanh hơn nhiều so với những gì bạn nghĩ. Tuy nhiên, công cụ brython.js mà bạn cần đưa vào các trang của mình là khoảng 500Kb. Ngoài ra, có vấn đề về việc nhập các thư viện chuẩn, mà Brython xử lý bằng cách tìm nạp các tệp .js riêng biệt với các yêu cầu XHR. Một số lib đã được biên dịch thành brython.js, vì vậy không phải mọi lần nhập sẽ kéo theo các tệp mới, nhưng nếu bạn sử dụng nhiều lần nhập, mọi thứ có thể trở nên chậm chạp. Tuy nhiên, có nhiều cách để giải quyết vấn đề này. Những gì tôi đã làm là kiểm tra tab mạng trong các công cụ dành cho nhà phát triển trình duyệt để xem tệp nào đang được kéo vào khi trang được tải, sau đó xóa tất cả các tệp mà dự án của tôi không sử dụng trong bản sao của thư mục Brython src, và chạy tập lệnh đi kèm với Brython (tôi nghĩ đó là ở Brython / www / scripts / make_VFS.py) biên dịch tất cả các lib có sẵn thành một tệp có tên py_VFS.js mà bạn cũng cần liên kết đến từ html của mình. Thông thường, nó sẽ tạo ra một tệp lớn hơn 2MB, nhưng nếu bạn xóa những thứ bạn không sử dụng, nó có thể khá nhỏ. Làm theo cách này, có nghĩa là bạn chỉ cần kéo brython.js, py_VFS.js và mã python của bạn và không cần yêu cầu XHR bổ sung.

Mặt khác, Transcrypt ( Github ) được phân phối dưới dạng gói python 3mà bạn có thể sử dụng theo cách thủ công hoặc móc vào chuỗi công cụ của mình để biên dịch trước python sang javascript. Vì vậy, với Transcrypt, bạn viết bằng python, chạy transcrypt đối với python và nó tạo ra javascript mà bạn có thể liên kết đến trong dự án của mình. Nó giống một trình biên dịch truyền thống hơn ở chỗ nó cung cấp một số quyền kiểm soát đầu ra. Ví dụ: bạn có thể chọn biên dịch sang ES6 hoặc ES5 hoặc yêu cầu nó xuất ra các bản đồ nguồn (trong quá trình gỡ lỗi, trình duyệt sẽ đưa bạn trực tiếp đến mã python tương ứng, bên trong mã javascript được tạo.) Đầu ra javascript của Transcrypt khá ngắn ( hay nói một cách khác, nó đẹp và ngắn gọn). Trong trường hợp của tôi, 150kB python được chuyển đổi thành 165kB của javascript ES5 chưa hợp nhất. Để so sánh, phiên bản Brython trong dự án của tôi đã sử dụng khoảng 800Kb sau khi chuyển đổi.

Tuy nhiên, để có được những lợi ích của Transcrypts terseness, đòi hỏi bạn phải đọc tài liệu một chút (thực sự chỉ là một chút). Ví dụ: với Transcrypt, tính năng 'truthiness' của Python cho các cấu trúc dữ liệu như dict, set và list không được bật theo mặc định và việc bật toàn cầu không được khuyến khích vì các vấn đề hiệu suất tiềm ẩn liên quan đến đánh máy. Để rõ ràng: Trong CPython, một mệnh đề, tập hợp hoặc danh sách trống có giá trị true là False, trong khi trong Javascript nó được coi là 'true' .. Ví dụ:

myList = []
if myList:    # False in CPython bcs it's empty, true in javascript bcs it exists
    # do some things.

Có ít nhất ba cách để giải quyết vấn đề này:

  • Sử dụng cờ -t khi chuyển đổi python thành javascript, ví dụ: $ transcrypt -t python.py (không được khuyến nghị, nhưng có lẽ không phải là vấn đề trừ khi bạn kiểm tra độ tin cậy nhiều lần trong các vòng lặp bên trong của mã nhạy cảm về hiệu suất ..)
  • Sử dụng __pragma__(tconv)hoặc __pragma__(notconv)trong mã của bạn để yêu cầu trình biên dịch mã hóa chuyển đổi tự động sang các giá trị sự thật giống python cục bộ.
  • Thay vì kiểm tra giá trị chân lý, hãy tránh hoàn toàn vấn đề bằng cách chỉ kiểm tra len (myList)> 0 ... Có lẽ điều đó sẽ ổn cho hầu hết các trường hợp, thực hiện công việc đối với việc sử dụng ánh sáng của tôi.

Đúng vậy, vì vậy dự án của tôi ngày càng lớn hơn và tôi muốn biên dịch trước để tăng hiệu suất nhưng cảm thấy khó làm như vậy với Brython (mặc dù về mặt kỹ thuật thì có thể, một cách dễ dàng là sử dụng trình chỉnh sửa trực tuyến và nhấp vào nút javascript để xem đầu ra). Tôi đã làm điều đó và liên kết với javascript được tạo từ project.html nhưng nó không hoạt động vì một số lý do. Ngoài ra, tôi cảm thấy khó hiểu các thông báo lỗi từ Brython nên tôi không biết bắt đầu từ đâu sau khi bước này không thành công. Ngoài ra, kích thước lớn của mã được xuất ra và kích thước của công cụ brython đã bắt đầu gây khó chịu cho tôi. Vì vậy, tôi quyết định xem xét kỹ hơn Transcrypt, thoạt đầu có vẻ như là cao cấp hơn vì tôi thích các hướng dẫn được rút ra cho tôi biết cách bắt đầu ngay lập tức (những hướng dẫn này đã được thêm vào).

Điều chính để thiết lập nó sau khi cài đặt Python3.5 là:

  1. Sử dụng venv (nó giống như phiên bản virtualenv tích hợp mới sử dụng ít dung lượng hơn cho mỗi dự án) để thiết lập thư mục dự án python3.5 (chỉ cần nhập: tên thư mục python3.5 -m venv - giải pháp thay thế cho ubuntu với các vấn đề về gói cho 3.5 ). Điều này làm cho 'tên thư mục' với một thư mục con bin trong số những thứ khác.
  2. Cài đặt gói python Transcrypt bằng pip ('foldername / bin / pip install transcrypt') sẽ cài đặt nó vào tên thư mục / lib / python3.5 / site-pack / transcrypt.
  3. activatethiết bị đầu cuối hiện tại nếu bạn không muốn phải nhập đường dẫn đầy đủ đến tên thư mục / bin / python3.5 mỗi lần. Kích hoạt bằng cách nhập: 'tên thư mục nguồn / bin / kích hoạt'
  4. Bắt đầu viết mã và biên dịch nó sang javascript để thử nghiệm. Biên dịch từ trong thư mục mà bạn viết mã vào. Ví dụ: tôi đã sử dụng tên thư mục / www / project. Vì vậy, CD vào thư mục đó và chạy: 'transcrypt -b your_python_script.py'. Điều đó đặt đầu ra trong một thư mục con được gọi __javascript__. Sau đó, bạn có thể liên kết đến javascript được xuất ra từ html của bạn.

Các vấn đề chính liên quan

Tôi có nhu cầu khá đơn giản, vì vậy số dặm của bạn có thể thay đổi.

  • Bạn cần thay thế lib chuẩn brython hoặc python bằng lib javascript. Vì vậy, ví dụ: 'import json' được cung cấp bởi Brython, nhưng trong Transcrypt, bạn có thể sử dụng javascript lib hoặc chỉ sử dụng JSON.parse / JSON.stringify trực tiếp trong mã Python của bạn. Để bao gồm phiên bản rút gọn của thư viện javascript trực tiếp trong mã python của bạn, hãy sử dụng định dạng này (lưu ý ba dấu ngoặc kép):

    __pragma__ ('js', '{}', '''
    // javascript code
    ''')
    
  • Các chức năng cụ thể trong html của Brython rõ ràng không hoạt động với Transcrypt. Chỉ cần sử dụng các cách javascript thông thường. Ví dụ: 1) trong Brython, bạn có thể đã tham chiếu đến một thẻ HTML cụ thể bằng cách sử dụng 'document [' id ']', nhưng với Transcrypt, bạn sẽ sử dụng 'document.getElementById (' id ') (giống như cách bạn làm nó từ javascript). 2) Bạn không thể xóa một nút bằng 'del nodeName' (bcs đó là một hàm brython). Sử dụng một cái gì đó như 'node.parentNode.removeChild (node)'. 3) thay thế tất cả các hàm DOM của brython bằng các lựa chọn thay thế javascript. ví dụ: class_name = className; text = textContent; html = innerHTML; cha = parentNode; children = childNodes, v.v. Tôi đoán nếu bạn cần thứ gì đó có chứa các lựa chọn thay thế được yêu cầu bởi một số trình duyệt cũ hơn thì có các thư viện javascript cho điều đó. 4) Set_timeout của Brython được thay thế bằng javascripts setTimeout 5) Các thẻ html của Brython như BR () cần được thay thế bằng cách sử dụng các cách javascript thông thường cũng như làm lại bất kỳ chỗ nào bạn đã sử dụng cú pháp thao tác <= dom. Chèn đánh dấu văn bản thuần túy dưới dạng innerHTML hoặc tạo các phần tử bằng cú pháp javascript và sau đó đính kèm chúng bằng cú pháp DOM javascript thông thường. Tôi cũng nhận thấy rằng đối với các hộp kiểm, brython sử dụng "if checkbox = 'check':" nhưng Transcrypt hài lòng với "if checkbox:" .. Chèn đánh dấu văn bản thuần túy dưới dạng innerHTML hoặc tạo các phần tử bằng cú pháp javascript rồi đính kèm chúng bằng cú pháp DOM javascript thông thường. Tôi cũng nhận thấy rằng đối với các hộp kiểm, brython sử dụng "if checkbox = 'check':" nhưng Transcrypt hài lòng với "if checkbox:" .. Chèn đánh dấu văn bản thuần túy dưới dạng innerHTML hoặc tạo các phần tử bằng cú pháp javascript rồi đính kèm chúng bằng cú pháp DOM javascript thông thường. Tôi cũng nhận thấy rằng đối với các hộp kiểm, brython sử dụng "if checkbox = 'check':" nhưng Transcrypt hài lòng với "if checkbox:" ..

  • Tôi đã hoàn thành dự án 2700 line vào tuần trước, lúc đó Transcrypt không có hỗ trợ cho một số thứ nhỏ (mặc dù chúng đủ dễ dàng để thay thế bằng chất độn), đây là 1) str.lower, str.split (str. split hiện có, nhưng dường như là phân tách javascript, hoạt động khác với phiên bản python, hành vi mà tôi đang dựa vào), 2) round (điều này dường như được hỗ trợ trong phiên bản dev bây giờ) và 3) isinstance didn 'không hoạt động trên str, int và float, chỉ trên dict, list và set. 4) Một điểm khác biệt khác so với Brython mà tôi nhận thấy là nếu tôi lấy biểu diễn JSON của một dict, tôi cần làm như vậy bằng cách sử dụng 'myDict = dict (data)', trong khi brython hài lòng với 'myDict = data'. Nhưng điều đó có thể liên quan đến thứ gì đó trong json.loads của Brython, mà tôi đã thay thế trực tiếp bằng JSON.parse.__pragma__('opov')cho cục bộ), bạn không thể thực hiện những việc như thiết lập các hoạt động bằng cách sử dụng định dạng được nạp chồng, nhưng cần sử dụng các chức năng tương ứng. Ví dụ

    a = set([1, 2, 3])
    b = set([3, 4, 5])
    a.difference(b)             # is used instead of a - b
    a.union(b)                  # used instead of a | b
    a.intersection(b)           # used instead of a & b
    a.symmetric_difference(b)   # used instead of a ^ b
    

6) Ngoài ra, bạn không thể lặp lại các di lệnh theo mặc định bằng cách sử dụng 'for i in dict:', mà không bật điều đó (cmd dòng -i hoặc __pragma__('iconv'), nhưng bạn có thể tránh phải bật nó bằng cách chỉ sử dụng thành viên key (), ví dụ:

for key, value in dict.items():
    # do things for each key and value..

Để tóm tắt

  • Tôi thích Brython vì nó dễ dàng làm quen và kiểm tra mã của bạn (chỉ cần F5). Nó gần giống với trăn thật vì hầu hết các lib tiêu chuẩn đều ở đó. Tôi không thích phải bao gồm công cụ chuyển đổi (Chỉnh sửa: Hoặc người ta có thể xem nó như một máy ảo python) trong trình duyệt và kích thước javascript đầu ra lớn. Nếu tôi phải làm lại mọi thứ (nhưng vẫn sử dụng Brython), tôi sẽ sử dụng các phương thức javascript để thao tác DOM từ brython (mà bạn có thể làm ..), thay vì dựa nhiều vào các phương pháp brython vì điều đó lãng phí thời gian di chuyển sang một trình vận chuyển khác khi nhu cầu của tôi thay đổi.

  • Tôi thích Transcrypt vì javascript được xuất ra thực sự 'gọn gàng và có ý nghĩa' và bởi vì thứ duy nhất bạn tải phía trình duyệt là mã javascript được tạo của bạn có kích thước tương tự như mã python của bạn. Cũng bởi vì nó hỗ trợ bản đồ nguồn và vì nó cung cấp cho tôi một biện pháp kiểm soát đối với javascript được xuất ra. Và việc sử dụng nó đã dạy tôi khá nhiều về tối ưu hóa.

Hy vọng điều đó sẽ giúp ai đó thấy cái nào trong số này có thể tốt cho dự án cụ thể của họ.


1
Bạn có chắc Brython là một trình chuyển đổi? Tôi khá chắc chắn rằng nó triển khai một trình thông dịch Python trong JavaScript. Nếu đó là một trình chuyển đổi, bạn không cần phải kết hợp nó với ứng dụng của mình.
Carl Smith

@Carl Smith Điểm thú vị, đã không nghĩ về nó như vậy. Brython chuyển đổi mã python thành javascript, nhưng vì javascript không có bytecode chuẩn, có thể người ta có thể xem javascript được tạo là 'bytecode' cho công cụ Brython.
fzzylogic

1
Bạn đã hiểu nhầm tôi. Tôi không nghĩ Brython chuyển Python sang JavaScript chút nào. Nó chỉ triển khai một trình thông dịch Python trong JS, thay vì C. Theo GitHub README của họ "Brython (Browser Python) là một triển khai Python 3 chạy trong trình duyệt, với giao diện cho các phần tử và sự kiện DOM".
Carl Smith

4
@jsbueno Hiện có sẵn là hạt giống, randint, lựa chọn và ngẫu nhiên, được coi là điểm khởi đầu. Trên thực tế, chúng tôi hy vọng rằng ai đó sẽ nhặt nó lên và hoàn thành nó, giống như đã được thực hiện đối với re, thứ nằm trong danh sách của chúng tôi. Không nên khó như vậy. Số lượng thư viện đã tăng lên nhưng những đóng góp rất đáng được hoan nghênh. Mặc dù trọng âm sẽ được duy trì khi sử dụng JS libs, cá nhân tôi hoan nghênh nhiều standardlibs hơn.
Jacques de Hooge

1
Một tổng quan tốt đẹp. Nhìn chung, điều tôi thấy là sự khác biệt chính (mà bạn nêu nhưng không nhấn mạnh) là mục tiêu của Brython thực sự là cho phép bạn sử dụng Python trong trình duyệt, trong khi mục tiêu của Transcrypt là cho phép bạn sử dụng cú pháp Python để viết JavaScript. Điều này có nghĩa là Transcrypt sẵn sàng làm những điều như sự khác biệt về độ tin cậy, lệch ở mức cơ bản so với ngữ nghĩa Python và dường như cũng nhằm vào mã sử dụng các thư viện JavaScript; trong khi Brython cố gắng sao chép Python càng gần càng tốt với ý tưởng rằng bạn sẽ làm mọi thứ bằng Python.
BrenBarn

12

Tôi đã sử dụng và cam kết skulpt cũng như pypyjs. Và cả ba đều rất khác nhau mà bất kỳ sự so sánh nào cũng là tranh cãi nếu bạn hỏi tôi.

Nó phụ thuộc vào những gì bạn đang tìm kiếm mà sẽ có ý nghĩa nhất.

PyPyJS

pypyjs rất lớn, nó là một tệp javascript 12MB chứa toàn bộ máy ảo pypy. Vì vậy, nếu bạn muốn việc triển khai python hoàn chỉnh thì đây là con của bạn. Nó có một cầu nối javascript hoạt động thực sự tốt nhưng nó không phải là một lựa chọn khả thi để viết mã trang web javascript của bạn bằng python. Tuy nhiên, nó sẽ cho phép bạn import compiler.

Nó được xây dựng bằng emscripten và nhanh hơn CPython, trong việc chạy điểm chuẩn pystone.

Tôi đã nói chuyện ngắn về pypyjs đây là các slide.

Skulpt

Là một công cụ giảng dạy (hoặc nó đã phát triển thành công cụ đó theo thời gian), nó biên dịch python của bạn thành một máy trạng thái mô phỏng rất chặt chẽ trình biên dịch cpython. Về cốt lõi, nó là một triển khai viết tay của trình biên dịch python trong javascript. Nó cho phép thực thi không đồng bộ cho phép bạn thực hiện:

while (True):
    print "hi"

Mà không cần khóa trình duyệt.

Skulpt là ứng dụng duy nhất hỗ trợ tính liên tục không đồng bộ, nó cho phép bạn tạm dừng việc thực thi python trong khi giải quyết một số điều không đồng bộ sắp xảy ra. Làm cho công việc này:

from time import sleep
sleep(1)

Skulpt chạy với tốc độ khoảng 1/10 tốc độ của CPython, khi so sánh với pystone.

Brython

Tôi biết ít nhất về cái này có lẽ @ olemis-lang có thể mở rộng cái này. Nhưng bên cạnh sự khác biệt rõ ràng rằng Brython là py3 và những người khác py2. Brython cũng là một người chuyển tiếp.

Brython không chạy tiêu chuẩn pystone vì time.clock không được triển khai, bởi vì nó chính thức là một chức năng phần cứng.


Các nhà phát triển PyPyJS đã ngừng phát triển. Ngoài ra hỗ trợ Python3 dường như vẫn chưa hoàn thành. github.com/pypyjs/pypyjs/issues/213github.com/pypyjs/pypyjs/issues/172
Roland Pihlakas

Nó không được duy trì, nhưng điều đó không có nghĩa là nó không hoạt động :) trinket.io/pypyjs nhưng hãy xem không gian này, tôi khá chắc chắn rằng cuối cùng một cái gì đó sẽ bong bóng trở lại. Ngoài ra, bạn không thể mong đợi mã nguồn mở được duy trì, trừ khi bạn tự làm điều đó. :)
albertjan

Đối với tôi, có vẻ như Trinket với Python 2 chạy ở phía trình duyệt, trong khi Trinket với Python 3 (và numpy) chạy ở phía máy chủ. Điều ấn tượng vẫn là họ quản lý để hiển thị biểu đồ trực quan trong trình duyệt, mặc dù mã chạy ở phía máy chủ. Sẽ rất hữu ích nếu biết làm thế nào họ đạt được điều đó. Bạn có bất cứ ý tưởng?
Roland Pihlakas

Trinket sử dụng thư viện GlowScript (glowscript.org) sử dụng RapydScript-NG để chuyển Python sang JavaScript và WebGL để tạo ra các hình ảnh động 3D. Cả quá trình chuyển ngữ và thực thi đều được thực hiện trong trình duyệt. Dưới đây là tổng quan về kiến ​​trúc GlowScript
user1114907

11

https://brythonista.wordpress.com/2015/03/28/comparing-the-speed-of-cpython-brython-skulpt-and-pypy-js/

Trang này đánh giá điểm chuẩn của ba ứng cử viên. Brython nổi lên như một người chiến thắng rõ ràng.

Mặc dù có 'sự trợ giúp' giải thích rằng SO không tốt cho loại câu hỏi này, có vẻ như một câu trả lời ngắn gọn là có thể trong trường hợp này.

Có lẽ mọi người đang quá vội vàng?


5
Lần trước tôi đã kiểm tra brython, nó không phải là một triển khai hoàn chỉnh của python. Nó cũng không rõ ràng làm thế nào "tốt nhất" hoặc "làm thế nào để lựa chọn giữa các" nên được đo lường. Nhanh nhất? Python hầu như không được sử dụng cho tốc độ. Thực hiện hầu hết các chức năng / thư viện? Có thể có những mô-đun bạn sẽ không bao giờ sử dụng trong trình duyệt. Cú pháp thêm (không tương thích với cpython) cho các phép toán thông thường (thao tác trên cây) là cộng hay trừ? Tôi không nghĩ rằng sự lâu dài trong một điểm chuẩn là có ý nghĩa.
ngữ đoạn

Điểm chuẩn hiệu suất là một yếu tố quan trọng khi nó không nhanh hơn khoảng 20 - 40% - mà là cải thiện khoảng 1000% trong một số hoạt động. Brython là một lớp lighweight trên javascript, vì vậy nó khác. Ngoài ra, dự án rất tuân thủ Python3 ngày nay - những gì nó làm là kết hợp một số thư viện Javascript trưởng thành và nổi tiếng trong dự án khi cần thiết, chẳng hạn như để xử lý số nguyên lớn.
jsbueno

7

Trước hết, tôi là người cam kết Brython. Tuy nhiên, tôi sẽ cố gắng tỏ ra khách quan nhất có thể vì lợi ích của việc đánh giá khách quan.

Lần cuối cùng tôi sử dụng nó Skulpt không hỗ trợ các tính năng như biểu thức trình tạo. Brython và PyPy.js làm như vậy, vì vậy ở cấp tính năng IMHO sau này vượt trội hơn.

Brython (tại thời điểm này) vẫn đang được hoàn thiện. Không thể nhập một số mô-đun (ví dụ: xml.ElementTree ). Tuy nhiên, tình hình này đang bắt đầu thay đổi vì chúng tôi đang nỗ lực hướng tới việc chạy toàn bộ bộ thử nghiệm CPython mặc dù đạt được khả năng tương thích hoàn toàn với các tiêu chuẩn (ít nhất là khi nó có ý nghĩa).

Brython cũng hỗ trợ .vfs.js để tăng tốc độ nhập mô-đun.

PyPy.js có một số đặc điểm dựa trên thực tế là nó được cung cấp bởi PyPy (biên dịch JIT, được thử nghiệm tốt, ...) nhưng tôi không chắc liệu nó có phù hợp để chạy trong trình duyệt hay không. Điều này có thể thay đổi khi dự án phát triển.

VIỆC CẦN LÀM: Tôi sẽ cố gắng bổ sung câu trả lời của mình bằng các điểm chuẩn đáng tin cậy.


8
Là một người cam kết đọc lướt, tôi có thể nói với bạn rằng nó hỗ trợ các biểu thức trình tạo. :)
albertjan

6

Không được đề cập ở đây là RapydScript hoặc RapydScript-NG. Họ tạo ra mã JavaScript rất hiệu quả, được sử dụng trong GlowScript VPython (glowscript.org). Tôi đã từng sử dụng RapydScript gốc của Alex Tsepkov ( https://github.com/atsepkov/RapydScript ) nhưng gần đây đã chuyển sang RapydScript-NG của Kovid Goyal ( https://github.com/kovidgoyal/rapydscript-ng ). Gần đây tôi đã chạy điểm chuẩn pystone trên CPython, RapydScript và Brython, và bạn có thể xem kết quả tại đây:

https://groups.google.com/forum/?fromgroups&hl=vi#!topic/brython/20hAC9L3ayE


Bạn có thể tóm tắt kết quả?
Jay

1
Vào ngày 18 tháng 6, Pierre Quentel cho biết, "Ok, có vấn đề về hiệu suất, nhưng mọi thứ đang tốt hơn; bản phát hành mà tôi hiện đang làm (3.2.7) chạy thử nghiệm pystone 2.5 nhanh hơn 3.2.6. Nó vẫn là 15 chậm hơn CPython gấp nhiều lần, nhưng những ngày đầu thì chậm hơn gấp ngàn lần ”.
user1114907

1
Tôi đã chạy điểm chuẩn pystone bằng cách sử dụng trình chuyển tiếp rapydscript-ng và nó đo tốc độ gấp 5 lần tốc độ CPython trên máy tính Windows 10 của tôi, 600000 pystone / giây so với 125000 pystone / giây. Hệ số khoảng 5 lần tốc độ CPython cho rapydscript-ng tăng lên khoảng 7 lần CPython nếu tôi tắt tính năng nạp chồng toán tử được sử dụng trong GlowScript VPython, trong đó ví dụ a + b được chuyển đổi thành ["+"] (b) ; điều này được thực hiện để cho phép dễ dàng thao tác các vectơ 3D.
user1114907

Tôi không thể nói rằng bình luận của Quentel đề cập đến Brython.
user1114907 25/07/17

2
Tôi đã không chạy bất kỳ điểm chuẩn nào nữa. Ban đầu tôi chuyển sang RapydScript-NG khi việc phát triển RapydScript bị đình trệ. Sau đó, khi Alex Tsepkov trở lại phát triển, tôi đã có một cuộc trao đổi với anh ấy, trong đó thậm chí anh ấy đồng ý rằng dự án NG của Kovid Goyal phù hợp hơn với mục đích sử dụng cụ thể của tôi tại glowscript.org. Tsepkov muốn xây dựng một ngôn ngữ Python / JavaScript hỗn hợp cho các lập trình viên web, trong khi Goyal nhấn mạnh Python tiêu chuẩn gần đúng và cung cấp hỗ trợ tốt cho việc biên dịch trong trình duyệt, cả hai đều là chìa khóa cho công việc của tôi.
user1114907 27/07/17

4

Vì không ai đề cập đến nó, tôi nghĩ nó là giá trị để đề cập đến Batavia , nơi triển khai máy ảo Python để chạy mã bytecode Python được biên dịch trước.

Tôi chỉ mới thử nó và mặc dù đây là một khái niệm thú vị nhưng nó vẫn đang ở giai đoạn đầu vì có rất ít tài liệu.

Cuối cùng nó sẽ phụ thuộc vào những gì bạn đang cố gắng làm. Tôi đã chọn Transcrypt sau khi xem xét vì nó thực dụng hơn và hoạt động tốt hơn, cũng được phát hành / bảo trì gần đây hơn.


Skulpt vẫn được duy trì và sử dụng tích cực bởi một cơ sở người dùng khá lớn (một số khóa học rất lớn về cousera), nó có thể không nhận được bản phát hành nhiều như transcrypt, nhưng có rất nhiều người bảo trì, người bảo trì đã xây dựng một sản phẩm trên đó. Vì vậy, họ sẽ ở trong đó về lâu dài. :)
albertjan

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.