Nhược điểm của Stackless Python là gì? [đóng cửa]


127

Gần đây tôi đã đọc về Stackless Python và nó dường như có nhiều lợi thế so với vanilla cPython. Nó có tất cả các tính năng thú vị như đệ quy vô hạn, microthreads, phần tiếp theo, v.v. và đồng thời nhanh hơn cPython (khoảng 10%, nếu tin tưởng wiki Python ) tương thích với nó (ít nhất là các phiên bản 2.5, 2.6 và 3.0).

Tất cả những điều này có vẻ gần như quá tốt là đúng. Tuy nhiên, TANSTAAFL , tôi không thấy nhiều sự nhiệt tình đối với Stackless trong cộng đồng Python và PEP 219 chưa bao giờ được thực hiện. Tại sao vậy? Nhược điểm của Stackless là gì? Những bộ xương nào được giấu trong tủ quần áo của Stackless?

(Tôi biết Stackless không cung cấp đồng thời thực sự, chỉ là một cách lập trình dễ dàng hơn theo cách đồng thời. Nó không thực sự làm phiền tôi.)

Câu trả lời:


165

Tôi không biết rằng "Stackless nhanh hơn 10%" trên Wiki đến từ đâu, nhưng một lần nữa tôi chưa bao giờ thử đo những con số hiệu suất đó. Tôi không thể nghĩ về những gì Stackless làm để tạo ra sự khác biệt lớn như vậy.

Stackless là một công cụ tuyệt vời với một số vấn đề tổ chức / chính trị.

Việc đầu tiên đến từ lịch sử. Christian Tismer bắt đầu nói về những gì cuối cùng trở thành Stackless khoảng 10 năm trước. Anh ta có một ý tưởng về những gì anh ta muốn, nhưng đã có một thời gian khó khăn để giải thích những gì anh ta đang làm và tại sao mọi người nên sử dụng nó. Điều này một phần là do nền tảng của anh ta không được đào tạo về CS về các ý tưởng như coroutines và bởi vì các bài thuyết trình và thảo luận của anh ta rất có định hướng thực hiện, khó có ai không hiểu sâu về việc tiếp tục hiểu cách sử dụng nó như một giải pháp để vấn đề của họ.

Vì lý do đó, các tài liệu ban đầu là người nghèo. Có một số mô tả về cách sử dụng nó, với những người đóng góp tốt nhất từ ​​bên thứ ba. Tại PyCon 2007, tôi đã nói chuyện về " Sử dụng Stackless ", kết quả khá tốt, theo số liệu khảo sát của PyCon. Richard Tew đã thực hiện một công việc tuyệt vời khi thu thập những thứ này, cập nhật stackless.com và duy trì phân phối khi các bản phát hành Python mới xuất hiện. Anh ấy là nhân viên của ĐCSTQ , nhà phát triển EVE Online, sử dụng Stackless như một phần thiết yếu trong hệ thống chơi game của họ.

Các trò chơi của ĐCSTQ cũng là ví dụ thực tế lớn nhất mà mọi người sử dụng khi họ nói về Stackless. Hướng dẫn chính cho Stackless là " Giới thiệu về lập trình đồng thời với Python không chồng " của Grant Olson , cũng hướng đến trò chơi. Tôi nghĩ rằng điều này mang đến cho mọi người một ý tưởng sai lệch rằng Stackless là định hướng trò chơi, khi mà các trò chơi được định hướng tiếp tục dễ dàng hơn.

Một khó khăn khác là mã nguồn. Ở dạng ban đầu, nó yêu cầu thay đổi nhiều phần của Python, điều này khiến Guido van Rossum, người dẫn đầu Python, cảnh giác. Một phần lý do, tôi nghĩ, là sự hỗ trợ cho cuộc gọi / cc mà sau đó đã bị xóa vì "quá giống như hỗ trợ một goto khi có các hình thức cấp cao hơn tốt hơn." Tôi không chắc chắn về lịch sử này, vì vậy chỉ cần đọc đoạn này là "Stackless được sử dụng để yêu cầu quá nhiều thay đổi."

Các bản phát hành sau này không yêu cầu thay đổi và Tismer tiếp tục thúc đẩy việc đưa nó vào Python. Mặc dù đã có một số cân nhắc, nhưng lập trường chính thức (theo như tôi biết) là CPython không chỉ là một triển khai Python mà nó còn có nghĩa là một triển khai tham chiếu và nó sẽ không bao gồm chức năng Stackless vì nó không thể được Jython triển khai hoặc Trăn sắt.

Hoàn toàn không có kế hoạch cho " những thay đổi đáng kể đối với cơ sở mã ". Đó là trích dẫn và siêu liên kết tham khảo từ Arafangion (xem bình luận) là từ khoảng 2000/2001. Những thay đổi về cấu trúc đã được thực hiện từ lâu, và đó là những gì tôi đã đề cập ở trên. Stackless như bây giờ là ổn định và trưởng thành, chỉ với một số điều chỉnh nhỏ cho cơ sở mã trong vài năm qua.

Một hạn chế cuối cùng với Stackless - không có người ủng hộ mạnh mẽ nào cho Stackless. Tismer hiện đang tham gia sâu với PyPy , đây là một triển khai Python cho Python. Anh ta đã thực hiện chức năng Stackless trong PyPy và coi nó vượt trội hơn nhiều so với chính Stackless, và cảm thấy rằng PyPy là con đường của tương lai. Tew duy trì Stackless nhưng anh ấy không quan tâm đến việc vận động. Tôi đã xem xét vai trò đó, nhưng không thể thấy làm thế nào tôi có thể kiếm thu nhập từ nó.

Mặc dù nếu bạn muốn đào tạo về Stackless, hãy liên hệ với tôi ! :)


39

phải mất khá lâu để tìm thấy cuộc thảo luận này. Lúc đó tôi không ở PyPy nhưng đã ngoại tình 2 năm với psyco, cho đến khi sức khỏe chấm dứt tất cả điều này khá đột ngột. Bây giờ tôi đang hoạt động trở lại và thiết kế một phương pháp thay thế - sẽ giới thiệu nó trên EuroPython 2012.

Hầu hết các tuyên bố của Andrew là chính xác. Một số bổ sung nhỏ:

Stackless nhanh hơn đáng kể so với CPython, 10 năm trước, vì tôi đã tối ưu hóa vòng lặp trình thông dịch. Vào thời điểm đó, Guido chưa sẵn sàng cho điều đó. Vài năm sau, mọi người đã thực hiện tối ưu hóa tương tự và thậm chí nhiều hơn và tốt hơn, điều này làm cho Stackless chậm hơn một chút, như mong đợi.

Về sự bao gồm: tốt, ngay từ đầu tôi đã rất thúc đẩy và tin rằng Stackless là con đường để đi. Sau này, khi gần như có thể được đưa vào, tôi đã mất hứng thú với điều đó và thích để nó theo cách này, một phần vì sự thất vọng, một phần để giữ quyền kiểm soát Stackless.

Các đối số như "các triển khai khác không thể thực hiện được" cảm thấy luôn khập khiễng với tôi, vì có những ví dụ khác mà đối số này cũng có thể được sử dụng. Tôi nghĩ rằng tôi nên quên đi điều đó và giữ tình bạn tốt với Guido, có bản phát hành của riêng tôi.

Trong khi đó mọi thứ đang thay đổi một lần nữa. Tôi đang làm việc trên PyPy và Stackless như một phần mở rộng Đôi khi sẽ nói về điều đó

Chúc mừng - Chris


5

Nếu tôi nhớ lại một cách chính xác, Stackless được dự kiến ​​đưa vào CPython chính thức, nhưng tác giả của stackless đã nói với những người CPython không làm như vậy, bởi vì anh ta dự định thực hiện một số thay đổi quan trọng đối với cơ sở mã - có lẽ anh ta muốn tích hợp sau dự án đã trưởng thành hơn.


1
Nguồn? Tôi thấy điều này thú vị, nhưng rõ ràng tôi không thể tin bạn chỉ vì bạn đã nói như vậy. Tôi sẽ nhìn kẻ ngốc nếu bạn sai và tôi bắt đầu nói về việc nó thú vị như thế nào.
Devin Jeanpierre

2
Điểm tuyệt vời. Xin lỗi, tôi không có tài liệu tham khảo, vì đó là trong một cuộc trò chuyện irc trong #python trên freenode, tuy nhiên tôi đã tìm được một cuộc trò chuyện danh sách gửi thư cổ tại gnosis.cx/doad/charming_python_10Deftakes.html giúp hiểu rõ hơn về tình hình.
Arafangion

Liên kết đó thực sự tuyệt vời. Nó trả lời rất nhiều câu hỏi của tôi.
Ryszard Szopa

Liên kết đó đã 8 hoặc 9 tuổi (nó nói về Python 2.1) và bất kỳ cuộc thảo luận nào về các thay đổi trong tương lai đối với cơ sở mã đã xảy ra từ lâu. Stackless Python ổn định và trưởng thành và không có kế hoạch nào cho "những thay đổi đáng kể đối với cơ sở mã".
Andrew Dalke

dalke: Đó là cách mọi thứ diễn ra - nếu có những thay đổi đáng kể đối với bất kỳ quyết định nào để tích hợp các thay đổi, hãy thoải mái đưa ra một tài liệu tham khảo mới hơn, tuy nhiên tôi nghi ngờ rằng nguồn cổ xưa mà tôi cung cấp chỉ bắt đầu xu hướng có các biến thể riêng biệt của python, ví dụ, JPython, IronPytion ..
Arafangion

3

Tôi cũng quan tâm đến câu trả lời ở đây. Tôi đã chơi một chút với Stackless và có vẻ như nó sẽ là một bổ sung tốt cho Python tiêu chuẩn.

PEP 219 không đề cập đến những khó khăn tiềm ẩn khi gọi mã Python từ mã C, nếu Python muốn thay đổi sang một ngăn xếp khác. Cần có những cách để phát hiện và ngăn chặn điều này (để tránh làm hỏng ngăn xếp C). Tôi nghĩ rằng điều này có thể dễ dàng, vì vậy tôi cũng tự hỏi tại sao Stackless phải tự đứng.


3
PEP 219 đã 9 tuổi và đã hết hạn. Những khó khăn của việc "gọi mã Python từ mã C" chỉ nằm ở việc triển khai được thảo luận trong PEP và không có trong Stackless. Tên của PEP ("Stackless Python") là một chút sai lầm; nó lấy cảm hứng từ Stackless và đó là nó.
Andrew Dalke
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.