Python ในเบราว์เซอร์: จะเลือกระหว่าง Brython, PyPy.js, Skulpt และ Transcrypt ได้อย่างไร?


91

ฉันตื่นเต้นมากที่เห็นว่าตอนนี้สามารถเขียนโค้ด Python ในเบราว์เซอร์ได้แล้ว นี่คือผู้สมัครหลัก (โปรดเพิ่มสิ่งที่ฉันอาจมองข้ามไป):

แต่จะเลือกอย่างไรระหว่างนั้น? ข้อแตกต่างที่ชัดเจนเพียงอย่างเดียวที่ฉันเห็นคือ Skulpt ใช้ Python 2 ในขณะที่ Brython ใช้ Python 3

โปรดทราบ: นี่ไม่ใช่คำขอคำแนะนำหรือความคิดเห็น ฉันกำลังมองหาข้อเท็จจริงที่มีวัตถุประสงค์เพื่อแจ้งทางเลือกที่มีการศึกษา


6
การขอให้เราแนะนำไลบรารีที่ดีที่สุดสำหรับบางสิ่งเป็นหนึ่งในกรณีที่ความช่วยเหลืออธิบายอย่างชัดเจนว่า StackOverflow ไม่ดีสำหรับ เป็นคำถามที่ดีไม่ใช่สำหรับรูปแบบของไซต์นี้ คุณอาจต้องการบางสิ่งที่อิงจากการสนทนาเช่นรายชื่ออีเมลหรือฟอรัม
ยกเลิก

2
Transcrypt ( transcrypt.org ) รวบรวมจากชุดย่อยขนาดใหญ่ของ python3.5 inc. การสืบทอดหลายรายการสร้างอย่างรวดเร็ว (การโทรบันทึก) โค้ดขนาดเล็กที่อ่านได้รองรับซอร์สแมปหลายระดับและสามารถใช้ JS lib ใด ๆ โดยไม่ต้องปรับ Disclaimer: ฉันเขียนมัน
Jacques de Hooge

1
สวัสดี fzzylogic ฉันได้เพิ่มแท็กแล้วตอนนี้ผู้คนสามารถถามคำถามเกี่ยวกับ SO โดยใช้มันได้ แทนที่แท็ก JS ด้วยแท็กเนื่องจากเป็นแท็กที่มีโอกาสน้อยที่สุดที่จะค้นหาว่าคุณต้องการใช้ Python ในเบราว์เซอร์หรือไม่
Jacques de Hooge

1
ฉันได้เขียนบทช่วยสอนเกี่ยวกับ Transcrypt สำหรับผู้เริ่มต้นแล้ว สามารถดูได้ที่github.com/bunkahle/Transcrypt-Examples/blob/master/alerts/…และgithub.com/bunkahle/Transcrypt-Examples/blob/master/cookies/…
bunkus

1
คำตอบที่ถูกลบโดย dstromberg ที่มี 27 upvotes มีลิงก์เปรียบเทียบที่ดี: stromberg.dnsalias.org/~strombrg/pybrowser/python-browser.html
Cees Timmerman

คำตอบ:



62

นี่คือข้อมูลบางส่วนเกี่ยวกับ Brython vs Transcrypt (กรกฎาคม 2016 เนื่องจากมีการเพิ่ม Transcrypt เป็นตัวเลือกสำหรับคำถามนี้โดย OP) รวบรวมโดยเริ่มต้นโครงการกับ Brython เมื่อไม่กี่เดือนที่ผ่านมาและย้ายไปที่ Transcrypt (ย้ายเสร็จเมื่อสัปดาห์ที่แล้ว) ฉันชอบ Brython และ Transcrypt และสามารถดูการใช้งานสำหรับทั้งคู่ได้

สำหรับคนที่ยังใหม่กับสิ่งนี้ Brython และ Transcrypt ทั้งอินพุต python 'Transcile' ไปยัง javascript (แก้ไข: อาจจะดีกว่าถ้ามองว่า Brython เป็น 'การใช้งาน Python สำหรับเบราว์เซอร์' เพราะมันไม่ได้สร้างจาวาสคริปต์แบบสแตนด์อโลน) ทั้งสองต้องใช้ไวยากรณ์ Python 3 Brython มีไลบรารีมาตรฐาน Python จำนวนมากและบางส่วนเป็นของตัวเองสำหรับจัดการกับสิ่งที่เกี่ยวข้องกับเว็บในขณะที่ Transcrypt หลีกเลี่ยงสิ่งนั้นส่วนใหญ่และแนะนำให้ใช้ไลบรารี Javascript แทน

ไบรตัน ( Github) สามารถทำการแปลงในเบราว์เซอร์ ดังนั้นคุณเขียนด้วย python และ brython.js engine จะแปลงเป็น javascript ได้ทันทีเมื่อโหลดเพจ สะดวกมากและเร็วกว่าที่คุณคิด อย่างไรก็ตามเอ็นจิ้น brython.js ที่คุณต้องรวมไว้ในเพจของคุณมีขนาดประมาณ 500Kb นอกจากนี้ยังมีเรื่องของการนำเข้าไลบรารีมาตรฐานซึ่ง Brython จัดการโดยการดึงไฟล์. js แยกต่างหากพร้อมคำขอ XHR libs บางตัวถูกคอมไพล์เป็น brython.js แล้วดังนั้นไม่ใช่ว่าการนำเข้าทุกครั้งจะดึงไฟล์ใหม่เข้ามา แต่ถ้าคุณใช้การนำเข้าจำนวนมากสิ่งต่างๆอาจช้า อย่างไรก็ตามมีวิธีรอบนี้ สิ่งที่ฉันทำคือตรวจสอบแท็บเครือข่ายในเครื่องมือ dev ของเบราว์เซอร์เพื่อดูว่าไฟล์ใดถูกดึงเข้าเมื่อโหลดหน้าจากนั้นลบไฟล์ทั้งหมดที่โครงการของฉันไม่ได้ใช้ในสำเนาของโฟลเดอร์ Brython src และเรียกใช้สคริปต์ที่มาพร้อมกับ Brython (ฉันคิดว่าเป็นที่ Brython / www / scripts / make_VFS.py) ที่รวบรวม libs ที่มีอยู่ทั้งหมดเป็นไฟล์เดียวที่เรียกว่า py_VFS.js ที่คุณต้องเชื่อมโยงจาก html ของคุณ โดยปกติมันจะสร้างไฟล์ขนาดใหญ่ 2MB + หนึ่งไฟล์ แต่ถ้าคุณลบสิ่งที่คุณไม่ได้ใช้มันอาจมีขนาดเล็กมาก การทำเช่นนี้หมายความว่าคุณต้องดึง brython.js, py_VFS.js และรหัส python ของคุณเท่านั้นและไม่จำเป็นต้องมีการร้องขอ XHR เพิ่มเติม

ในทางกลับกัน Transcrypt ( Github ) แจกจ่ายเป็นแพ็คเกจ python 3ที่คุณสามารถใช้ด้วยตนเองหรือเชื่อมต่อกับ toolchain ของคุณเพื่อรวบรวม python กับ javascript ไว้ล่วงหน้า ด้วย Transcrypt คุณจะเขียนด้วย python เรียกใช้ transcrypt กับ python และพ่นจาวาสคริปต์ที่คุณสามารถเชื่อมโยงไปยังโครงการของคุณได้ มันเป็นเหมือนคอมไพเลอร์แบบดั้งเดิมที่มีการควบคุมเอาต์พุตบางอย่าง ตัวอย่างเช่นคุณสามารถเลือกที่จะคอมไพล์เป็น ES6 หรือ ES5 หรือขอให้ส่งออกซอร์สแมป (ซึ่งในระหว่างการดีบักให้เบราว์เซอร์นำคุณไปยังรหัส python ที่เกี่ยวข้องโดยตรงในส่วนของรหัสจาวาสคริปต์ที่สร้างขึ้น) เอาต์พุตจาวาสคริปต์ของ Transcrypt นั้นค่อนข้างสั้น ( หรือพูดอีกอย่างก็สวยและสั้น) ในกรณีของฉัน 150kB ของ python ถูกแปลงเป็น 165kB ของจาวาสคริปต์ ES5 ที่ไม่มีการปิดกั้น จากการเปรียบเทียบโครงการของฉันเวอร์ชัน Brython ใช้ประมาณ 800Kb หลังจากการแปลง

อย่างไรก็ตามการจะได้รับประโยชน์จาก Transcrypts terseness นั้นจำเป็นต้องอ่านเอกสารสักหน่อย (จริงๆแค่นิดหน่อย) ตัวอย่างเช่นด้วย Transcrypt 'ความจริง' ของ Python สำหรับโครงสร้างข้อมูลเช่น dict, set และ list จะไม่ถูกเปิดใช้งานโดยค่าเริ่มต้นและการเปิดใช้งานทั่วโลกจะไม่ได้รับการสนับสนุนเนื่องจากปัญหาด้านประสิทธิภาพที่อาจเกิดขึ้นที่เกี่ยวข้องกับการตรวจสอบการพิมพ์ เพื่อความชัดเจน: ภายใต้ CPython คำสั่งที่ว่างเปล่าชุดหรือรายการมีค่าความจริงเป็นเท็จในขณะที่ใน Javascript ถือว่าเป็น 'จริง' .. ตัวอย่าง:

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

มีอย่างน้อยสามวิธีในการแก้ไขปัญหานี้:

  • ใช้แฟล็ก -t เมื่อแปลง python เป็น javascript เช่น $ transcrypt -t python.py (ไม่แนะนำ แต่อาจไม่ใช่ปัญหาเว้นแต่คุณจะตรวจสอบความจริงหลายครั้งในโค้ดที่มีความละเอียดอ่อนด้านประสิทธิภาพ .. )
  • ใช้__pragma__(tconv)หรือ__pragma__(notconv)ภายในโค้ดของคุณเพื่อบอกให้คอมไพเลอร์ทรานสคริปต์เปิดการแปลงอัตโนมัติเป็นค่าความจริงแบบไพ ธ อนในเครื่อง
  • แทนที่จะตรวจสอบค่าความจริงหลีกเลี่ยงปัญหาทั้งหมดโดยเพียงแค่ตรวจสอบ len (myList)> 0 ... บางทีนั่นอาจจะดีสำหรับสถานการณ์ส่วนใหญ่งานสำหรับการใช้งานเบาของฉัน

ถูกต้องดังนั้นโปรเจ็กต์ของฉันเริ่มใหญ่ขึ้นและฉันต้องการคอมไพล์ล่วงหน้าเพื่อเพิ่มประสิทธิภาพ แต่พบว่ามันยากที่จะทำเช่นนั้นกับ Brython (แม้ว่าจะเป็นไปได้ในทางเทคนิควิธีง่ายๆในการใช้โปรแกรมแก้ไขออนไลน์และคลิกปุ่มจาวาสคริปต์เพื่อดู ผลลัพธ์). ฉันทำเช่นนั้นและเชื่อมโยงกับ javascript ที่สร้างขึ้นจาก project.html แต่ไม่ได้ผลด้วยเหตุผลบางประการ นอกจากนี้ฉันพบว่ามันยากที่จะเข้าใจข้อความแสดงข้อผิดพลาดจาก Brython ดังนั้นฉันจึงไม่รู้ว่าจะเริ่มจากตรงไหนหลังจากขั้นตอนนี้ล้มเหลว นอกจากนี้ขนาดใหญ่ของรหัสที่ส่งออกและขนาดของเครื่องยนต์ brython ก็เริ่มรบกวนฉัน ดังนั้นฉันจึงตัดสินใจที่จะดู Transcrypt อย่างใกล้ชิดซึ่งในตอนแรกดูเหมือนจะเกรดสูงกว่าเพราะฉันชอบคำแนะนำที่โง่ลงซึ่งบอกวิธีเริ่มต้นทันที (ตั้งแต่นั้นมา)

สิ่งสำคัญในการตั้งค่าหลังจากติดตั้ง Python3.5 คือ:

  1. ใช้ venv (เป็นเหมือน Virtualenv เวอร์ชันใหม่ในตัวที่ใช้พื้นที่น้อยลงสำหรับแต่ละโปรเจ็กต์) เพื่อตั้งค่าโฟลเดอร์โปรเจ็กต์ python3.5 (เพียงพิมพ์: python3.5 -m venv foldername - วิธีแก้ปัญหาสำหรับ Ubuntu ที่มีปัญหาแพ็คเกจสำหรับ 3.5 ). สิ่งนี้ทำให้ 'ชื่อพับ' มีโฟลเดอร์ย่อย bin เหนือสิ่งอื่นใด
  2. ติดตั้งแพ็คเกจ Transcrypt python ด้วย pip ('foldername / bin / pip install transcrypt') ซึ่งจะติดตั้งลงใน foldername / lib / python3.5 / site-Packages / transcrypt
  3. activateเทอร์มินัลปัจจุบันหากคุณไม่ต้องการพิมพ์เส้นทางแบบเต็มไปยังชื่อพับ / bin / python3.5 ทุกครั้ง เปิดใช้งานโดยพิมพ์: 'source foldername / bin / enable'
  4. เริ่มเขียนโค้ดและรวบรวมลงในจาวาสคริปต์เพื่อทดสอบ คอมไพล์จากภายในโฟลเดอร์ที่คุณเขียนโค้ดตัวอย่างเช่นฉันใช้ชื่อพับ / www / project ดังนั้นซีดีลงในโฟลเดอร์นั้นแล้วเรียกใช้: 'transcrypt -b your_python_script.py' __javascript__ทำให้ว่าการส่งออกในโฟลเดอร์ย่อยที่เรียกว่า จากนั้นคุณสามารถเชื่อมโยงไปยังจาวาสคริปต์ที่ส่งออกมาจาก html ของคุณ

ประเด็นหลักที่กำลังดำเนินการอยู่

ฉันมีความต้องการที่ค่อนข้างง่ายดังนั้นระยะทางของคุณอาจแตกต่างกันไป

  • คุณต้องแทนที่ libs มาตรฐาน brython หรือ python ด้วย javascript libs ตัวอย่างเช่น 'import json' จัดทำโดย Brython แต่ภายใต้ Transcrypt คุณสามารถใช้ javascript lib หรือใช้ JSON.parse / JSON.stringify โดยตรงในโค้ด Python ของคุณ หากต้องการรวมไลบรารี javascript เวอร์ชันย่อลงในโค้ด python ของคุณโดยตรงให้ใช้รูปแบบนี้ (สังเกตเครื่องหมายอัญประกาศสาม):

    __pragma__ ('js', '{}', '''
    // javascript code
    ''')
    
  • ฟังก์ชั่นเฉพาะ html ของ Brython ไม่ทำงานกับ Transcrypt อย่างเห็นได้ชัด เพียงใช้จาวาสคริปต์ตามปกติ ตัวอย่าง: 1) ภายใต้ Brython คุณอาจอ้างถึงแท็ก HTML ที่เฉพาะเจาะจงโดยใช้ "document ['id']" แต่หากใช้ Transcrypt คุณจะใช้ "document.getElementById ('id') (ซึ่งเป็นวิธีเดียวกับที่คุณทำ จากจาวาสคริปต์) 2) คุณไม่สามารถลบโหนดด้วย 'del nodeName' (bcs นั่นคือฟังก์ชัน brython) ใช้บางอย่างเช่น 'node.parentNode.removeChild (node)' 3) แทนที่ฟังก์ชัน DOM ทั้งหมดของ brython ด้วยทางเลือกของจาวาสคริปต์ เช่น class_name = className; ข้อความ = textContent; html = innerHTML; parent = parentNode; children = childNodes เป็นต้นฉันเดาว่าหากคุณต้องการสิ่งที่มีทางเลือกอื่นที่จำเป็นสำหรับเบราว์เซอร์รุ่นเก่าบางตัวก็มีไลบรารีจาวาสคริปต์สำหรับสิ่งนั้น 4) set_timeout ของ Brython ถูกแทนที่ด้วย javascripts setTimeout 5) ต้องเปลี่ยนแท็ก html ของ Brython เช่น BR () โดยใช้วิธีจาวาสคริปต์ปกติรวมถึงการทำซ้ำทุกที่ที่คุณใช้มันเป็นไวยากรณ์การจัดการ <= dom ฉีดมาร์กอัปข้อความธรรมดาเป็น innerHTML หรือสร้างองค์ประกอบโดยใช้ไวยากรณ์ javascript แล้วแนบโดยใช้ไวยากรณ์ javascript DOM ปกติ ฉันสังเกตว่าสำหรับช่องทำเครื่องหมาย brython ใช้ "if checkbox = 'checked':" แต่ Transcrypt พอใจกับ "if checkbox:" .. ฉีดมาร์กอัปข้อความธรรมดาเป็น innerHTML หรือสร้างองค์ประกอบโดยใช้ไวยากรณ์ javascript แล้วแนบโดยใช้ไวยากรณ์ javascript DOM ปกติ ฉันสังเกตว่าสำหรับช่องทำเครื่องหมาย brython ใช้ "if checkbox = 'checked':" แต่ Transcrypt พอใจกับ "if checkbox:" .. ฉีดมาร์กอัปข้อความธรรมดาเป็น innerHTML หรือสร้างองค์ประกอบโดยใช้ไวยากรณ์ javascript แล้วแนบโดยใช้ไวยากรณ์ javascript DOM ปกติ ฉันยังสังเกตเห็นว่าสำหรับช่องทำเครื่องหมาย brython ใช้ "if checkbox = 'checked':" แต่ Transcrypt พอใจกับ "if checkbox:" ..

  • ฉันเสร็จสิ้นการย้ายโครงการสาย 2700 ในสัปดาห์ที่แล้วซึ่งในเวลานั้น Transcrypt ไม่ได้รับการสนับสนุนสำหรับสิ่งเล็กน้อยบางอย่าง (แม้ว่าจะง่ายพอที่จะแทนที่ด้วยฟิลเลอร์) แต่สิ่งเหล่านี้คือ 1) str.lower, str.split (str. การแยกมีอยู่ แต่ดูเหมือนว่าจะเป็นการแยกจาวาสคริปต์ซึ่งทำงานแตกต่างจากเวอร์ชัน python พฤติกรรมที่ฉันอาศัยอยู่) 2) รอบ (ดูเหมือนว่าจะได้รับการสนับสนุนในเวอร์ชัน dev ในขณะนี้) และ 3) isinstance ไม่ ไม่ทำงานกับ str, int และ float เฉพาะใน dict, list และ set 4) ข้อแตกต่างจาก Brython ที่ฉันสังเกตเห็นก็คือถ้าฉันดึงการแสดง JSON ของ dict ฉันต้องทำเช่นนั้นโดยใช้ 'myDict = dict (data)' ในขณะที่ brython พอใจกับ 'myDict = data' แต่นั่นอาจเกี่ยวข้องกับบางอย่างใน json.loads ของ Brython ซึ่งฉันแทนที่โดยตรงด้วย JSON.parse__pragma__('opov')สำหรับท้องถิ่น) คุณไม่สามารถทำสิ่งต่างๆเช่นตั้งค่าการดำเนินการโดยใช้รูปแบบที่โอเวอร์โหลด แต่จำเป็นต้องใช้ฟังก์ชันที่เกี่ยวข้อง เช่น

    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) นอกจากนี้คุณไม่สามารถวนซ้ำคำสั่งตามค่าเริ่มต้นโดยใช้ 'for i in dict:' โดยไม่เปิดใช้งาน (cmd line -i หรือ__pragma__('iconv')แต่คุณสามารถหลีกเลี่ยงการเปิดใช้งานได้โดยใช้สมาชิกคีย์ () เช่น:

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

เพื่อสรุป

  • ฉันชอบ Brython เพราะมันง่ายที่จะไปกับมันและทดสอบโค้ดของคุณ (แค่ F5) ใกล้เคียงกับ python จริงมากขึ้นเพราะ lib มาตรฐานส่วนใหญ่อยู่ที่นั่น ฉันไม่ชอบที่จะต้องรวมกลไกการถ่ายโอนข้อมูล (แก้ไข: หรืออาจมองว่าเป็น python VM) ในเบราว์เซอร์และขนาดจาวาสคริปต์ที่ขยายใหญ่ออกไป ถ้าฉันต้องทำสิ่งต่าง ๆ (แต่ยังคงใช้ Brython) ฉันจะใช้วิธีการจาวาสคริปต์เพื่อจัดการ DOM จาก brython (ซึ่งคุณสามารถทำได้ .. ) แทนที่จะใช้วิธี brython มากเพราะเสียเวลาในการย้ายข้าม ไปยังเครื่องถ่ายโอนข้อมูลอื่นเมื่อความต้องการของฉันเปลี่ยนไป

  • ฉันชอบ Transcrypt เพราะจาวาสคริปต์ที่ส่งออกมานั้น 'ลีนและมีความหมาย' จริงๆและเนื่องจากสิ่งเดียวที่คุณโหลดฝั่งเบราว์เซอร์คือโค้ดจาวาสคริปต์ที่คุณสร้างขึ้นซึ่งมีขนาดใกล้เคียงกับโค้ดไพ ธ อนของคุณ ด้วยเพราะมันรองรับซอร์สแมปและเนื่องจากมันทำให้ฉันสามารถควบคุมจาวาสคริปต์ที่ส่งออกมาได้ และการใช้มันสอนฉันค่อนข้างน้อยเกี่ยวกับการเพิ่มประสิทธิภาพ

หวังว่าจะช่วยให้ใครบางคนเห็นว่าสิ่งใดที่อาจดีสำหรับโครงการเฉพาะของพวกเขา


1
แน่ใจหรือว่า Brython เป็นทรานสไพเลอร์? ฉันค่อนข้างมั่นใจว่ามันใช้ Python interpreter ใน JavaScript หากเป็นทรานสไพเลอร์คุณไม่จำเป็นต้องรวมเข้ากับแอปของคุณ
คาร์ลสมิ ธ

@Carl Smith จุดที่น่าสนใจไม่ได้คิดแบบนั้น Brython แปลงรหัส python เป็น javascript แต่เนื่องจาก javascript ไม่มี bytecode มาตรฐานอาจมีคนดูจาวาสคริปต์ที่สร้างขึ้นเป็น 'bytecode' สำหรับเอ็นจิ้น Brython
fzzylogic

1
คุณเข้าใจฉันผิด. ฉันไม่คิดว่า Brython จะแปลง Python เป็น JavaScript เลย เพียงแค่ใช้ตัวแปล Python ใน JS แทนที่จะเป็น C. ตาม GitHub README "Brython (Browser Python) เป็นการใช้งาน Python 3 ที่ทำงานในเบราว์เซอร์โดยมีอินเทอร์เฟซกับองค์ประกอบ DOM และเหตุการณ์"
Carl Smith

4
@jsbueno มีให้บริการในขณะนี้ ได้แก่ seed, randint, choice และ random ซึ่งมีความหมายเพียงแค่จุดเริ่มต้น อันที่จริงเราหวังว่าจะมีคนหยิบมันขึ้นมาและทำให้มันเสร็จสมบูรณ์เหมือนกับที่ทำเพื่อ re ซึ่งสูงในรายการของเรา ไม่น่าจะยากขนาดนั้น จำนวนห้องสมุดเพิ่มขึ้น แต่การมีส่วนร่วมได้รับการต้อนรับอย่างดี แม้ว่าสำเนียงจะยังคงใช้งานได้โดยใช้ JS libs ฉันยินดีต้อนรับ standardlibs เพิ่มเติมเป็นการส่วนตัว
Jacques de Hooge

1
ภาพรวมที่ดี โดยรวมแล้วสิ่งที่ฉันเห็นว่าเป็นข้อแตกต่างหลัก (ซึ่งคุณระบุ แต่ไม่เน้นย้ำ) คือเป้าหมายของ Brython คือให้คุณใช้ Python ในเบราว์เซอร์ในขณะที่ดูเหมือนว่าเป้าหมายของ Transcrypt คือให้คุณใช้ไวยากรณ์ Python เพื่อเขียน JavaScript ซึ่งหมายความว่า Transcrypt ยินดีที่จะทำสิ่งต่างๆเช่นความแตกต่างของความจริงซึ่งเบี่ยงเบนไปในระดับพื้นฐานจากความหมายของ Python และดูเหมือนว่าจะมุ่งเป้าไปที่โค้ดที่ใช้ประโยชน์จากไลบรารี JavaScript ในขณะที่ Brython พยายามจำลอง Python ให้ใกล้เคียงที่สุดโดยคิดว่าคุณจะทำทุกอย่างใน Python
BrenBarn

12

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

หน้านี้เปรียบเทียบผู้สมัครสามคน Brython กลายเป็นผู้ชนะที่ชัดเจน

แม้จะมี 'ความช่วยเหลือ' ที่อธิบายว่า SO ไม่ดีสำหรับคำถามประเภทนี้ แต่ดูเหมือนว่าในกรณีนี้จะมีคำตอบที่กระชับ

อาจจะเป็นคนที่เร่งรีบเกินไป?


5
ครั้งสุดท้ายที่ฉันตรวจสอบ brython มันไม่ใช่การใช้งาน python ที่สมบูรณ์ ยังไม่ชัดเจนว่าควรวัด "ดีที่สุด" หรือ "วิธีเลือกระหว่างสิ่งเหล่านี้" อย่างไร ที่เร็วที่สุด? Python ส่วนใหญ่ไม่ได้ใช้เพื่อความเร็ว ใช้ฟังก์ชัน / ไลบรารีส่วนใหญ่? อาจมีโมดูลที่คุณไม่เคยใช้ในเบราว์เซอร์ ไวยากรณ์พิเศษ (เข้ากันไม่ได้กับ cpython) สำหรับการดำเนินการทั่วไป (การจัดการต้นไม้) บวกหรือลบ? ฉันไม่คิดว่าประสิทธิภาพในเกณฑ์มาตรฐานจะมีความหมายขนาดนั้น
ไวยากรณ์

เกณฑ์มาตรฐานประสิทธิภาพเป็นปัจจัยสำคัญเมื่อไม่ได้เร็วขึ้นประมาณ 20-40% แต่เป็นการปรับปรุงประมาณ 1000% ในการดำเนินการบางอย่าง Brython เป็นเลเยอร์ที่มีน้ำหนักเบาเหนือจาวาสคริปต์ดังนั้นจึงแตกต่างกัน นอกจากนี้โครงการยังสอดคล้องกับ Python3 อย่างมากในทุกวันนี้สิ่งที่ทำคือการรวมไลบรารี Javascript ที่เป็นที่รู้จักและเป็นผู้ใหญ่เพียงไม่กี่ไลบรารีไว้ในโปรเจ็กต์ตามความจำเป็นตัวอย่างเช่นสำหรับการจัดการจำนวนเต็มจำนวนมาก
jsbueno

12

ฉันเคยใช้และมุ่งมั่นที่จะ skulpt และ pypyjs และทั้งสามต่างกันมากว่าการเปรียบเทียบใด ๆ คือการสงสัยถ้าคุณถามฉัน

ขึ้นอยู่กับสิ่งที่คุณกำลังมองหาซึ่งจะเข้าท่าที่สุด

PyPyJS

pypyjs มีขนาดใหญ่มากเป็นไฟล์จาวาสคริปต์ขนาด 12MB ที่มีเครื่องเสมือน pypy ทั้งหมด ดังนั้นหากคุณต้องการความสมบูรณ์ของการใช้งานหลามนี่คือลูกน้อยของคุณ มีสะพานจาวาสคริปต์ที่ใช้งานได้ดีจริง ๆ แต่ไม่ใช่ตัวเลือกที่ใช้งานได้สำหรับการเขียนโค้ดเว็บไซต์จาวาสคริปต์ใน python import compilerแต่มันจะช่วยให้คุณ

มันสร้างขึ้นด้วย emscripten และเร็วกว่า CPython ในการรันเกณฑ์มาตรฐาน pystone

ฉันพูดสั้น ๆ เกี่ยวกับ pypyjs นี่คือสไลด์

Skulpt

เป็นเครื่องมือการเรียนการสอน (หรือมีการพัฒนาไปเรื่อย ๆ ) โดยรวบรวม python ของคุณไว้ในเครื่องสถานะที่เลียนแบบคอมไพเลอร์ cpython อย่างใกล้ชิด ที่สำคัญคือการใช้งานคอมไพเลอร์ python ด้วยลายมือในจาวาสคริปต์ ช่วยให้สามารถดำเนินการแบบอะซิงโครนัสซึ่งช่วยให้คุณทำ:

while (True):
    print "hi"

โดยไม่ต้องล็อคเบราว์เซอร์

Skulpt เป็นตัวเดียวที่รองรับการต่อเนื่องแบบอะซิงโครนัสช่วยให้คุณหยุดการทำงานของ python ชั่วคราวในขณะที่กำลังแก้ไขบางสิ่งที่ไม่ตรงกันให้เกิดขึ้น การทำงานนี้:

from time import sleep
sleep(1)

Skulpt วิ่งด้วยความเร็วประมาณหนึ่งในสิบของความเร็ว CPython เมื่อเปรียบเทียบ pystone

Brython

ฉันรู้อย่างน้อยเกี่ยวกับเรื่องนี้บางที @ olemis-lang สามารถขยายสิ่งนี้ได้ แต่ถัดจากความแตกต่างที่ชัดเจนคือ Brython คือ py3 และ py2 อื่น ๆ Brython ยังเป็นผู้ถ่ายทอด

Brython ไม่ได้เรียกใช้เกณฑ์มาตรฐาน pystone เนื่องจาก time.clock ไม่ได้ใช้งานเนื่องจากเป็นฟังก์ชันฮาร์ดแวร์อย่างเป็นทางการ


นักพัฒนา PyPyJS หยุดการพัฒนาแล้ว ดูเหมือนว่าการสนับสนุน Python3 จะยังไม่เสร็จสิ้น github.com/pypyjs/pypyjs/issues/213และgithub.com/pypyjs/pypyjs/issues/172
Roland Pihlakas

ไม่ได้รับการบำรุงรักษา แต่ไม่ได้หมายความว่าจะใช้ไม่ได้ :) trinket.io/pypyjsแต่ดูพื้นที่นี้ฉันค่อนข้างมั่นใจว่าจะมีบางอย่างเกิดขึ้นอีกครั้งในที่สุด นอกจากนี้คุณไม่สามารถคาดหวังให้โอเพ่นซอร์สได้รับการดูแลเว้นแต่คุณจะทำด้วยตัวเอง :)
albertjan

สำหรับฉันแล้ว Trinket พร้อม Python 2 ทำงานในฝั่งเบราว์เซอร์ในขณะที่ Trinket กับ Python 3 (และ numpy) ทำงานที่ฝั่งเซิร์ฟเวอร์ มันยังคงน่าประทับใจที่พวกเขาจัดการเพื่อแสดงการพล็อตภาพในเบราว์เซอร์แม้ว่าโค้ดจะทำงานในฝั่งเซิร์ฟเวอร์ก็ตาม จะมีประโยชน์มากหากทราบว่าพวกเขาบรรลุเป้าหมายนั้นได้อย่างไร คุณมีความคิดหรือไม่?
Roland Pihlakas

1
Trinket ใช้ไลบรารี GlowScript (glowscript.org) ซึ่งใช้ RapydScript-NG เพื่อแปลง Python เป็น JavaScript และ WebGL เพื่อสร้างภาพเคลื่อนไหว 3 มิติ ทั้งการถ่ายโอนและการดำเนินการจะทำในเบราว์เซอร์ นี่คือภาพรวมของสถาปัตยกรรมGlowScript
user1114907

7

ก่อนอื่นฉันเป็นผู้คอมมิชชันของ Brython อย่างไรก็ตามฉันจะพยายามทำตัวเป็นกลางให้มากที่สุดเพื่อประโยชน์ในการประเมินตามวัตถุประสงค์

ครั้งสุดท้ายที่ฉันใช้ Skulpt ไม่รองรับคุณสมบัติเช่นนิพจน์ตัวสร้าง Brython และ PyPy.js ทำได้ดังนั้นในระดับคุณลักษณะ IMHO ในภายหลังจะเหนือกว่า

Brython (ในขณะนี้) ยังอยู่ระหว่างดำเนินการ บางโมดูลไม่สามารถนำเข้าได้ (เช่นxml.ElementTree ) อย่างไรก็ตามสถานการณ์นี้เริ่มเปลี่ยนไปเนื่องจากเรากำลังดำเนินการเพื่อเรียกใช้ชุดทดสอบ CPython ทั้งหมดแม้ว่าจะมีความเข้ากันได้อย่างสมบูรณ์กับมาตรฐาน (อย่างน้อยก็เมื่อเหมาะสม)

Brython ยังรองรับ. vfs.js เพื่อเร่งการนำเข้าโมดูล

PyPy.js มีคุณสมบัติหลายประการที่ตรงไปตรงมาจากการที่มันขับเคลื่อนโดย PyPy (การรวบรวม JIT ผ่านการทดสอบอย่างดี ... สิ่งนี้อาจเปลี่ยนแปลงไปเมื่อโครงการพัฒนาขึ้น

สิ่งที่ต้องทำ: ฉันจะพยายามเสริมคำตอบของฉันด้วยเกณฑ์มาตรฐานที่เชื่อถือได้


8
ในฐานะผู้คอมมิชชันของ skulpt ฉันสามารถบอกคุณได้ว่ามันรองรับนิพจน์ตัวสร้าง :)
albertjan

6

ไม่ได้กล่าวถึงในที่นี้คือ RapydScript หรือ RapydScript-NG พวกเขาสร้างโค้ด JavaScript ที่มีประสิทธิภาพมากซึ่งใช้ใน GlowScript VPython (glowscript.org) ฉันเคยใช้ RapydScript ดั้งเดิมของ Alex Tsepkov ( https://github.com/atsepkov/RapydScript ) แต่เพิ่งเปลี่ยนมาใช้ RapydScript-NG ของ Kovid Goyal ( https://github.com/kovidgoyal/rapydscript-ng ) ฉันเพิ่งใช้มาตรฐาน pystone บน CPython, RapydScript และ Brython และคุณสามารถดูผลลัพธ์ได้ที่นี่:

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


สรุปผลได้ไหม
Jay

1
เมื่อวันที่ 18 มิถุนายนปิแอร์เควนเทลกล่าวว่า "ตกลงมีปัญหาด้านประสิทธิภาพ แต่สิ่งต่างๆกำลังดีขึ้นรุ่นที่ฉันกำลังดำเนินการอยู่ (3.2.7) รันการทดสอบ pystone 2.5 เร็วกว่า 3.2.6 มันยังคงเป็น 15 ช้ากว่า CPython หลายเท่า แต่ในยุคแรกช้ากว่าหลายพันเท่า "
user1114907

1
ฉันใช้มาตรฐาน pystones โดยใช้ rapydscript-ng Transpiler และได้เปรียบเทียบความเร็วของ CPython 5 เท่าบนคอมพิวเตอร์ Windows 10 ของฉัน, 600000 pystones / วินาทีเทียบกับ 125000 pystones / วินาที ปัจจัยของความเร็ว CPython ประมาณ 5 เท่าสำหรับ rapydscript-ng จะเพิ่มขึ้นเป็นประมาณ 7 เท่า CPython ถ้าฉันปิดตัวดำเนินการโอเวอร์โหลดที่ใช้ใน GlowScript VPython ซึ่งตัวอย่างเช่น a + b จะถูกแปลงเป็น ["+"] (b) ; สิ่งนี้ทำขึ้นเพื่อให้สามารถจัดการเวกเตอร์ 3 มิติได้อย่างง่ายดาย
user1114907

ฉันล้มเหลวที่จะบอกว่าความคิดเห็นของ Quentel อ้างถึง Brython
user1114907

2
ฉันไม่ได้เรียกใช้เกณฑ์มาตรฐานอีกแล้ว ตอนแรกฉันเปลี่ยนไปใช้ RapydScript-NG เมื่อการพัฒนา RapydScript หยุดชะงัก จากนั้นต่อมาเมื่อ Alex Tsepkov กลับสู่การพัฒนาฉันได้แลกเปลี่ยนกับเขาซึ่งแม้ว่าเขาจะเห็นด้วยว่าโครงการ NG ของ Kovid Goyal นั้นเหมาะสมกว่าสำหรับการใช้งานเฉพาะของฉันที่ glowscript.org Tsepkov ต้องการสร้างภาษา Python / JavaScript แบบผสมสำหรับโปรแกรมเมอร์เว็บในขณะที่ Goyal เน้นการประมาณ Python มาตรฐานและให้การสนับสนุนที่ดีสำหรับการรวบรวมในเบราว์เซอร์ซึ่งทั้งสองอย่างนี้เป็นกุญแจสำคัญในการทำงานของฉัน
user1114907

4

เนื่องจากไม่มีใครพูดถึงเรื่องนี้ฉันคิดว่ามันคุ้มค่าที่จะพูดถึงBataviaซึ่งใช้เครื่องเสมือน Python สำหรับการเรียกใช้ Bytecode Python ที่คอมไพล์ไว้ล่วงหน้า

ฉันเพิ่งลองใช้และแม้ว่าจะเป็นแนวคิดที่น่าสนใจ แต่ก็ยังอยู่ในช่วงเริ่มต้นเนื่องจากมีเอกสารประกอบเพียงเล็กน้อย

ท้ายที่สุดมันจะขึ้นอยู่กับสิ่งที่คุณพยายามทำ ฉันเลือกTranscryptหลังจากดูแล้วเพราะมันใช้งานได้จริงและมีประสิทธิภาพที่ดีกว่าและยังเพิ่งเปิดตัว / ดูแล


Skulpt ยังคงได้รับการดูแลและใช้งานโดยฐานผู้ใช้ที่มีขนาดใหญ่พอสมควร (หลายหลักสูตรหลายหลักสูตรใน cousera) อาจไม่ได้รับการเผยแพร่มากเท่า transcrypt แต่มีผู้ดูแลรักษาผู้ดูแลที่สร้างผลิตภัณฑ์ขึ้นมามากมาย ดังนั้นพวกเขาจึงอยู่ในระยะยาว :)
อัลเบิร์ตจาน

3

นี่คือการประชุมที่อัปเดตซึ่งเปรียบเทียบตัวเลือกที่มีอยู่ทั้งหมดในตลาดตอนนี้:

https://www.youtube.com/watch?v=2XSeNQyPlTY

ผู้พูดคือ Russell Keith-Magee ซึ่งเป็นนักพัฒนาที่รู้จักกันดีในพื้นที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.