Tại sao tôi không nên sử dụng PyPy trên CPython nếu PyPy nhanh hơn 6,3 lần?


684

Tôi đã nghe rất nhiều về dự án PyPy . Họ tuyên bố nó nhanh hơn 6,3 lần so với trình thông dịch CPython trên trang web của họ .

Bất cứ khi nào chúng ta nói về các ngôn ngữ động như Python, tốc độ là một trong những vấn đề hàng đầu. Để giải quyết điều này, họ nói PyPy nhanh hơn 6,3 lần.

Vấn đề thứ hai là song song, Khóa phiên dịch toàn cầu khét tiếng (GIL). Đối với điều này, PyPy nói rằng nó có thể cung cấp cho Python không có GIL .

Nếu PyPy có thể giải quyết những thách thức lớn này, điểm yếu nào của nó đang ngăn cản việc áp dụng rộng rãi hơn? Điều đó có nghĩa là, điều gì ngăn cản một người như tôi, một nhà phát triển Python điển hình, chuyển sang PyPy ngay bây giờ ?


30
Những bình luận bị thanh trừng bởi vì hầu hết là những điều nên được đưa ra trong câu trả lời (và trong một số trường hợp là), hoặc không nên nói gì cả. Cũng được chỉnh sửa để giải quyết một số mối quan tâm nêu lên về tính chủ quan của câu hỏi này. Hãy cố gắng trả lời bằng cách sử dụng các sự kiện và sao lưu các xác nhận với các nguồn nếu có thể!
Shog9

3
Tôi đã sử dụng Pypy rất nhiều. Nó có xu hướng làm việc rất tốt. Tuy nhiên, trong khi Pypy nhanh hơn một chút đối với nhiều khối lượng công việc nặng CPU, thì nó thực sự chậm hơn đối với khối lượng công việc nặng I / O mà tôi đã ném vào nó. Ví dụ, tôi đã viết một chương trình sao lưu trùng lặp được gọi là backshift. Đối với một bản sao lưu ban đầu, trong đó có rất nhiều tập tin, pypy là tuyệt vời. Nhưng đối với các bản sao lưu tiếp theo chủ yếu chỉ là cập nhật dấu thời gian, CPython nhanh hơn.
dstromberg

Câu trả lời:


657

LƯU Ý: PyPy đã trưởng thành hơn và được hỗ trợ tốt hơn so với năm 2013, khi câu hỏi này được hỏi. Tránh rút ra kết luận từ thông tin lỗi thời.


  1. PyPy, như những người khác đã nhanh chóng đề cập đến, có sự ủng hộ mong manh cho các phần mở rộng C . Nó hỗ trợ, nhưng thường ở tốc độ chậm hơn Python và tốt nhất là iffy. Do đó rất nhiều mô-đun chỉ cần CPython. PyPy không hỗ trợ numpy PyPy hiện hỗ trợ numpy . Một số tiện ích mở rộng vẫn chưa được hỗ trợ (Pandas, SciPy, v.v.), hãy xem danh sách các gói được hỗ trợ trước khi thực hiện thay đổi.
  2. Hỗ trợ Python 3 đang thử nghiệm tại thời điểm này. vừa đạt ổn định! Kể từ ngày 20 tháng 6 năm 2014, PyPy3 2.3.1 - Fulcrum đã ra mắt !
  3. PyPy đôi khi không thực sự nhanh hơn cho "script", mà rất nhiều người sử dụng Python cho. Đây là những chương trình ngắn hạn làm một cái gì đó đơn giản và nhỏ. Vì PyPy là trình biên dịch JIT nên các ưu điểm chính của nó đến từ thời gian dài và các loại đơn giản (như số). Thành thật mà nói, tốc độ JIT trước của PyPy khá tệ so với CPython.
  4. Quán tính . Di chuyển đến PyPy thường đòi hỏi phải trang bị lại, mà đối với một số người và tổ chức đơn giản là quá nhiều công việc.

Đó là những lý do chính ảnh hưởng đến tôi, tôi nói.


14
Rất vui khi bạn đề cập đến trang bị lại. Ví dụ, máy chủ web của tôi có lựa chọn giữa Python 2.4 và 2.5; và một "nhà sản xuất phần mềm giải trí lớn" gần tôi đang sử dụng 2.6 mà không có kế hoạch nâng cấp sớm. Đôi khi nó có thể là một nỗ lực lớn, tốn kém để thậm chí khám phá chi phí chuyển đổi.
Mike Housky

19
PyPy "nhanh như C" liên quan đến C chung hơn là các thư viện C nhận biết bộ đệm đa luồng được tối ưu hóa cao được sử dụng cho số. Đối với số, Python chỉ được sử dụng để di chuyển xung quanh các con trỏ đến các mảng lớn. Vì vậy, PyPy "nhanh như C" có nghĩa là "con trỏ + siêu dữ liệu của bạn được di chuyển nhanh như C". Không phải là một thỏa thuận lớn. Vậy thì tại sao phải bận tâm với Python? Hãy nhìn vào chữ ký chức năng trong cblas và lapacke.
cjordan1

12
@ cjordan1: Tôi không hiểu bạn đang nói gì. Các cấu trúc numpy cấp cao cực kỳ biểu cảm ( np.sum(M[1:2*n**2:2, :2*n**2] * M[:2*n**2:2, :2*n**2].conjugate(), axis=1)?) Trong Python và điều đó làm cho Python rất phù hợp với cộng đồng khoa học. Ngoài ra, thực hiện các phần không chuyên sâu trong Python và tách ra C cho các vòng lặp chuyên sâu nhỏ hơn là một chiến lược phổ biến và có thể sử dụng được.
Veedrac

26
@Veedrac Đó là những gì tôi muốn nói. Như trong "Hãy xem các chữ ký hàm trong cblas và lapacke" bởi vì chúng quá dài và khó sử dụng nên bạn sẽ hiểu ngay tại sao chúng ta sử dụng Python để di chuyển xung quanh con trỏ và siêu dữ liệu.
cjordan1

5
@ tommy.carstensen Đây thực sự không phải là một nơi tốt để đi sâu, nhưng tôi sẽ thử. 1. Điều này đúng hơn rất nhiều khi tôi viết nó so với bây giờ. 2. "Tập lệnh" nặng về IO. IO của PyPy vẫn thường chậm hơn CPython - nó thường chậm hơn đáng kể. 3. PyPy trước đây chậm hơn CPython khi xử lý chuỗi - bây giờ nó thường tốt hơn và hiếm khi tệ hơn. 4. Nhiều "tập lệnh" chỉ là mã keo - làm cho trình thông dịch nhanh hơn sẽ không cải thiện thời gian chạy chung trong trường hợp đó. 5. Thời gian khởi động của PyPy thường lớn hơn - các tập lệnh chạy ngắn hiếm khi được quản lý để tạo ra nhiều mã nóng.
Veedrac

104

Trang web đó không yêu cầu PyPy nhanh hơn 6,3 lần so với CPython. Để trích:

Trung bình hình học của tất cả các điểm chuẩn là nhanh hơn 0,16 hoặc 6,3 lần so với CPython

Đây là một tuyên bố rất khác với tuyên bố về chăn mà bạn đã thực hiện và khi bạn hiểu được sự khác biệt, bạn sẽ hiểu ít nhất một lý do tại sao bạn không thể chỉ nói "sử dụng PyPy". Nghe có vẻ giống như tôi đang chọn nit, nhưng hiểu tại sao hai tuyên bố này hoàn toàn khác nhau là điều quan trọng.

Để phá vỡ điều đó:

  • Tuyên bố họ đưa ra chỉ áp dụng cho điểm chuẩn họ đã sử dụng. Nó hoàn toàn không nói gì về chương trình của bạn (trừ khi chương trình của bạn giống hệt như một trong những điểm chuẩn của họ).

  • Tuyên bố là về trung bình của một nhóm các điểm chuẩn. Không có tuyên bố rằng việc chạy PyPy sẽ cải thiện 6,3 lần ngay cả đối với các chương trình mà họ đã thử nghiệm.

  • Không có tuyên bố rằng PyPy thậm chí sẽ chạy tất cả các chương trình mà CPython chạy ở tất cả , hãy để một mình nhanh hơn.


15
Tất nhiên, không có tuyên bố rằng PyPy sẽ chạy tất cả mã Python nhanh hơn. Nhưng nếu bạn sử dụng tất cả các ứng dụng Python thuần túy, tôi có thể đặt cược rằng phần lớn trong số chúng sẽ chạy nhanh hơn (> 3 lần) trên PyPy sau đó trên CPython.
Robert Zaremba

18
Cả hai điểm đầu tiên của bạn đều có ý nghĩa. Làm thế nào bạn có thể nói rằng điểm chuẩn nói "hoàn toàn không có gì về chương trình của bạn". Rõ ràng là điểm chuẩn không phải là một chỉ số hoàn hảo cho tất cả các ứng dụng thực, nhưng chúng chắc chắn có thể hữu ích như một chỉ báo. Ngoài ra tôi không hiểu những gì bạn thấy sai lệch về họ báo cáo trung bình của một nhóm điểm chuẩn. Họ tuyên bố khá rõ ràng đó là một mức trung bình. Nếu một lập trình viên không hiểu trung bình là gì thì họ có mối quan tâm nghiêm trọng hơn nhiều so với hiệu suất ngôn ngữ.
Sean Geoffrey Pietz

6
@SeanGeoffreyPietz - Tôi không khẳng định trang web của PyPy là bất kỳ cách nào gây hiểu lầm - họ đã trình bày kết quả của họ một cách chính xác. Nhưng câu hỏi ban đầu đã đánh giá sai chúng, và đang chứng minh rằng tác giả không hiểu tầm quan trọng của từ 'trung bình'. Nhiều điểm chuẩn riêng lẻ không nhanh hơn 6,3 lần. Và nếu bạn sử dụng một loại trung bình khác, bạn sẽ nhận được một giá trị khác, vì vậy "nhanh hơn 6,3 lần" không phải là một bản tóm tắt đầy đủ về "trung bình hình học nhanh hơn 6,3 lần". "Nhóm A nhanh hơn Z lần so với nhóm B" quá mơ hồ không có ý nghĩa.
spookylukey

6
-1: @spookylukey Bạn dường như đề xuất rằng bộ điểm chuẩn bị sai lệch mà không cung cấp bằng chứng để hỗ trợ cho yêu cầu bồi thường. Phê bình phải luôn luôn được sao lưu với bằng chứng!
Evgeni Sergeev

5
@EvgeniSergeev - không, tôi ngụ ý rằng tất cả các điểm chuẩn đều bị sai lệch! Không nhất thiết phải cố tình, tất nhiên. Không gian của các chương trình hữu ích có thể là vô hạn và vô cùng đa dạng, và một tập hợp các điểm chuẩn chỉ bao giờ đo lường hiệu suất trên các điểm chuẩn đó. Hỏi "PyPy nhanh hơn CPython bao nhiêu?" giống như hỏi "Fred nhanh hơn Joe bao nhiêu?", đó là điều mà OP dường như muốn biết.
spookylukey

74

Vì pypy không tương thích 100%, cần 8 hợp đồng ram để biên dịch, là mục tiêu di động và mang tính thử nghiệm cao, trong đó cpython ổn định, mục tiêu mặc định cho các nhà xây dựng mô-đun trong 2 thập kỷ (bao gồm cả các tiện ích mở rộng c không hoạt động trên pypy ), và đã được triển khai rộng rãi.

Pypy có thể sẽ không bao giờ là triển khai tham chiếu, nhưng nó là một công cụ tốt để có.


2
Theo pypy.org/doad.html , PyPy cần 4 GB RAM để biên dịch (trên hệ thống 64 bit), chứ không phải 8. Và có một tùy chọn trên trang đó để thực hiện dưới 3 GB nếu cần.
knite

4
@knite 1: đó là mới vào năm 2015, tài liệu đã đọc 8 GB trong lịch sử. 2: trong thực tế năm 2015 bạn vẫn cần ít nhất 8, với 6-7 miễn phí.
Tritium21

4
Yêu cầu bộ nhớ để biên dịch là không phù hợp nếu bạn sử dụng bản dựng hoặc phân phối . Đối với "mục tiêu di động và thử nghiệm cao", bạn có thể đưa ra một vài ví dụ về những thứ bị phá vỡ không? Một lần nữa, nếu mọi người đang sử dụng các bản dựng phát hành thay vì các bản dựng hoặc nguồn hàng đêm, họ không có kỳ vọng hợp lý về chức năng?
smci

@smci Đây là một câu hỏi cổ dựa trên dữ liệu cổ, với câu trả lời cổ. Hãy xem xét câu hỏi này và mọi câu trả lời đều mang tính lịch sử đối với tình trạng pypy 4 năm trước.
Tritium21

1
@ Tritium21: Tôi chỉ quan tâm đến câu trả lời hiện tại. Nó là gì? Bạn có thể muốn chỉnh sửa câu trả lời của mình để nói "Kể từ năm 2013, so sánh pypy so với phiên bản 2.x của Python là ..." Ngoài ra nếu yêu cầu "trung bình hình học 6,3x" trong câu hỏi đã lỗi thời ( như trong 4/2017 họ yêu cầu 7,5 lần, nhưng thậm chí sau đó phụ thuộc vào điểm chuẩn ... ), sau đó cũng cần chỉnh sửa (số phiên bản, dữ liệu mới nhất, v.v.) Tôi nghĩ rằng bộ điểm chuẩn không liên quan lắm, hầu như không ai chạy ngày nay, raytracing trong một ngôn ngữ kịch bản trên CPU. Tôi đã tìm thấy pybenchmark.org
smci

36

Câu hỏi thứ hai dễ trả lời hơn: về cơ bản bạn có thể sử dụng PyPy như một sự thay thế thả xuống nếu tất cả mã của bạn là Python thuần túy. Tuy nhiên, nhiều thư viện được sử dụng rộng rãi (bao gồm một số thư viện chuẩn) được viết bằng C và được biên dịch dưới dạng phần mở rộng Python. Một số trong số này có thể được thực hiện để làm việc với PyPy, một số thì không. PyPy cung cấp cùng một công cụ "hướng về phía trước" như Python --- nghĩa là nó là Python --- nhưng các bộ phận bên trong của nó thì khác, vì vậy các công cụ có giao diện với các bộ phận đó sẽ không hoạt động.

Đối với câu hỏi đầu tiên, tôi tưởng tượng nó là một loại Catch-22 với câu hỏi đầu tiên: PyPy đã phát triển nhanh chóng trong nỗ lực cải thiện tốc độ và tăng cường khả năng tương tác với các mã khác. Điều này đã làm cho nó nhiều thử nghiệm hơn chính thức.

Tôi nghĩ rằng có thể nếu PyPy ở trạng thái ổn định, nó có thể bắt đầu được sử dụng rộng rãi hơn. Tôi cũng nghĩ rằng sẽ rất tuyệt nếu Python tránh xa nền tảng C của nó. Nhưng nó sẽ không xảy ra trong một thời gian. PyPy chưa đạt đến khối lượng quan trọng, nơi nó gần như đủ hữu ích để tự mình làm mọi thứ bạn muốn, điều này sẽ thúc đẩy mọi người lấp đầy khoảng trống.


17
Tôi không nghĩ C là ngôn ngữ sẽ sớm xuất hiện ở bất cứ đâu vào bất cứ lúc nào (tôi sẽ sẵn sàng nói rằng nó sẽ không biến mất trong cuộc sống của chúng ta). cho đến khi có một ngôn ngữ khác sẽ chạy ở bất cứ đâu, chúng ta sẽ có C. (lưu ý, JVM được viết bằng C. Ngay cả java, ngôn ngữ "chạy khắp mọi nơi" cần C vì tính toàn diện của nó.) Nếu không thì tôi đồng ý với bài đăng này trên hầu hết. điểm của nó.
Tritium21

7
@ Tritium21: Vâng, tôi chỉ biên tập ở đó. Tôi vẫn ổn với C hiện có, nhưng tôi nghĩ rằng sự phụ thuộc của Python vào C cực kỳ bất lợi và PyPy là một ví dụ tuyệt vời về lý do: bây giờ chúng tôi có cơ hội để có được Python nhanh hơn, nhưng chúng tôi đã tăng gấp ba lần dựa vào C Sẽ tốt hơn nhiều nếu Python tự đứng bằng hai chân của mình. Thậm chí sẽ ổn nếu bản thân Python được viết bằng C, nhưng vấn đề là sự tồn tại của một cơ chế mở rộng khuyến khích mọi người mở rộng Python theo những cách phụ thuộc vào C.
BrenBarn

4
thanh kiếm hai lưỡi trên đó - một phần của điều khiến python trở nên phổ biến là khả năng mở rộng các ứng dụng khác và được mở rộng bởi các ứng dụng khác. Nếu bạn mang nó đi, tôi không nghĩ chúng ta sẽ nói về con trăn.
Tritium21

10
@BrenBarn Hoàn toàn có thể khẳng định rằng sự phụ thuộc của Python vào C là bất lợi. Nếu không có C-API của Python, hầu hết các thư viện thực sự mạnh mẽ và sự can thiệp tuyệt vời mà Python có được trong những năm thiếu niên hình thành (cuối thập niên 90), bao gồm toàn bộ giao diện hệ sinh thái / khoa học số và giao diện GUI, sẽ không thể thực hiện được. Nhìn xung quanh để có được một số quan điểm về toàn bộ vũ trụ sử dụng Python, trước khi đưa ra những tuyên bố như vậy.
Peter Wang

4
@PeterWang Tất cả các thư viện đó có thể được viết bằng Python, tuy nhiên chúng sẽ không nhanh như vậy. Điều BrenBarn đang nói là bây giờ chúng ta có cơ hội tạo ra python đủ nhanh để những lib đó có thể được viết bằng python nhưng chúng ta từ chối nắm lấy cơ hội đó, bởi vì nó có nghĩa là mất khả năng sử dụng các thư viện C. Tôi tin rằng đó là những gì anh ta nói bất lợi, không phải sự tồn tại của các thư viện C là một điều xấu mà là cách duy nhất để tạo ra các thư viện nhanh là sử dụng C.
vikki

14

Tôi đã làm một điểm chuẩn nhỏ về chủ đề này. Mặc dù nhiều áp phích khác đã đưa ra những điểm tốt về khả năng tương thích, nhưng kinh nghiệm của tôi là PyPy không nhanh hơn nhiều khi chỉ di chuyển xung quanh các bit. Đối với nhiều mục đích sử dụng Python, nó thực sự chỉ tồn tại để dịch bit giữa hai hoặc nhiều dịch vụ. Ví dụ, không có nhiều ứng dụng web đang thực hiện phân tích dữ liệu chuyên sâu về CPU. Thay vào đó, họ lấy một số byte từ một máy khách, lưu trữ chúng trong một số loại cơ sở dữ liệu và sau đó trả chúng lại cho các máy khách khác. Đôi khi định dạng của dữ liệu được thay đổi.

Các nhà phát triển BDFL và CPython là một nhóm người thông minh đáng chú ý và có quản lý để giúp CPython thực hiện xuất sắc trong kịch bản như vậy. Đây là một plugin blog không biết xấu hổ: http://www.hydrogen18.com/blog/unpickling-buffers.html . Tôi đang sử dụng Stackless, có nguồn gốc từ CPython và vẫn giữ giao diện mô-đun C đầy đủ. Tôi không tìm thấy bất kỳ lợi thế nào khi sử dụng PyPy trong trường hợp đó.


1
PyPy có rất nhiều, chạy cẩn thận điểm chuẩn (không giống như CPython, không thực sự có bộ điểm chuẩn đối mặt với người dùng tại thời điểm này). Tất nhiên đối với lưu lượng truy cập mạng, PyPy không thể làm mọi thứ nhanh hơn.
Julian

1
Julian, đáng chú ý là những người PyPy đã tập trung rất nhiều nỗ lực vào việc cải thiện thời gian chạy của bộ tiêu chuẩn cụ thể đó trong nhiều năm nay. Ở một mức độ nào đó, dường như họ đang "vượt quá" sự tối ưu hóa của họ đối với tập hợp điểm chuẩn này và, theo kinh nghiệm của tôi, ngoài các tính toán đơn thuần bằng số (dù sao cũng tốt hơn ở Fortran hoặc C99), tôi chưa bao giờ nhận được PyPy nhiều hơn nhanh hơn ~ 2 lần so với CPython.
Alex Rubinsteyn

9
@AlexRubinsteyn Nhưng quan điểm của những người làm việc trên PyPy thường là nếu bạn tìm thấy một trường hợp PyPy chậm hơn CPython và bạn có thể biến nó thành một điểm chuẩn hợp lý, nó có cơ hội tốt để được thêm vào bộ phần mềm.
gsnedder

1
Tôi đã kiểm tra blog của bạn. Trong kết quả của bạn, cặp python (Pickle, StringIO) cho thấy pypy nhanh hơn ~ 6,8 lần so với cpython. Tôi nghĩ rằng đây là một kết quả hữu ích. Trong kết luận của bạn, bạn chỉ ra (chính xác) rằng mã pypy (là python đơn giản!) Chậm hơn mã C (cPickle, cStringIO), không phải mã cpython.
Caleb Hattedh

1
@gsnedders tôi đã đưa ra một chuẩn mực dựa trên rinohtype trên nhiều dịp . Họ chưa thêm nó vào bộ.
Brecht Machiels

12

Hỏi: Nếu PyPy có thể giải quyết những thách thức lớn này (tốc độ, tiêu thụ bộ nhớ, song song) so với CPython, điểm yếu nào của nó đang ngăn cản việc áp dụng rộng rãi hơn?

A: Đầu tiên, có rất ít bằng chứng cho thấy nhóm PyPy có thể giải quyết vấn đề tốc độ nói chung . Bằng chứng dài hạn cho thấy PyPy chạy một số mã Python chậm hơn CPython và nhược điểm này dường như bắt nguồn rất sâu trong PyPy.

Thứ hai, phiên bản hiện tại của PyPy tiêu thụ nhiều bộ nhớ hơn CPython trong một bộ trường hợp khá lớn. Vì vậy, PyPy chưa giải quyết được vấn đề tiêu thụ bộ nhớ.

Liệu PyPy có giải quyết được những thách thức lớn được đề cập hay không và nói chung sẽ nhanh hơn, ít đói hơn và thân thiện với song song hơn CPython là một câu hỏi mở không thể giải quyết trong thời gian ngắn. Một số người đang đặt cược rằng PyPy sẽ không bao giờ có thể đưa ra một giải pháp chung cho phép nó thống trị CPython 2.7 và 3.3 trong mọi trường hợp.

Nếu PyPy thành công tốt hơn CPython nói chung, điều đáng nghi ngờ, điểm yếu chính ảnh hưởng đến việc áp dụng rộng rãi hơn của nó sẽ là khả năng tương thích với CPython. Ngoài ra còn có các vấn đề như CPython chạy trên phạm vi rộng hơn của CPU và HĐH, nhưng những vấn đề này ít quan trọng hơn nhiều so với hiệu suất của PyPy và các mục tiêu tương thích CPython.


H: Tại sao bây giờ tôi không thể thay thế CPython bằng PyPy?

Trả lời: PyPy không tương thích 100% với CPython vì nó không mô phỏng CPython dưới mui xe. Một số chương trình vẫn có thể phụ thuộc vào các tính năng độc đáo của CPython không có trong PyPy như liên kết C, triển khai C của đối tượng & phương thức Python hoặc tính chất gia tăng của trình thu gom rác của CPython.


Câu trả lời này không trích dẫn bất kỳ điểm chuẩn hoặc cung cấp tài liệu tham khảo.
qwr 14/2/19

7

CPython có tính năng tham chiếu và thu gom rác, PyPy chỉ có bộ sưu tập rác.

Vì vậy, các đối tượng có xu hướng bị xóa sớm hơn và __del__được gọi theo cách dễ dự đoán hơn trong CPython. Một số phần mềm dựa trên hành vi này, do đó chúng chưa sẵn sàng để chuyển sang PyPy.

Một số phần mềm khác hoạt động với cả hai, nhưng sử dụng ít bộ nhớ hơn với CPython, vì các đối tượng không sử dụng được giải phóng trước đó. (Tôi không có bất kỳ phép đo nào để cho biết mức độ quan trọng của nó và những chi tiết triển khai khác ảnh hưởng đến việc sử dụng bộ nhớ.)


17
Cần nhấn mạnh rằng việc dựa vào __del__việc được gọi sớm hoặc hoàn toàn sai ngay cả trong CPython. Như bạn nói, nó thường hoạt động và một số người cho rằng điều đó có nghĩa là nó được đảm bảo. Nếu bất cứ điều gì tham chiếu đến đối tượng bị cuốn vào một chu trình tham chiếu (khá dễ dàng - bạn có biết rằng việc kiểm tra ngoại lệ hiện tại theo một cách không bị hạn chế nào đó sẽ tạo ra một chu trình tham chiếu không?) (có thể không bao giờ ). Nếu đối tượng tự nó là một phần của chu trình tham chiếu, __del__sẽ không được gọi ở tất cả (trước Python 3.4).

3
Chi phí trên mỗi đối tượng cao hơn trong CPython, vấn đề RẤT NHIỀU khi bạn bắt đầu tạo nhiều đối tượng. Tôi tin rằng PyPy tương đương với các vị trí theo mặc định, vì một điều.

4

Đối với rất nhiều dự án, thực sự có chênh lệch 0% giữa các con trăn khác nhau về tốc độ. Đó là những thứ bị chi phối bởi thời gian kỹ thuật và nơi mà tất cả các con trăn có cùng số lượng hỗ trợ thư viện.


1
Nếu dự án của bạn đơn giản như vậy, thì rõ ràng nó không thành vấn đề, nhưng điều tương tự cũng có thể nói về bất kỳ việc thực hiện bất kỳ ngôn ngữ nào: nếu tất cả những gì bạn làm là tổng hợp các chức năng của các thư viện khác thông qua ABI tương đối hiệu quả, thì tất cả đều không liên quan.

1
Nó không có gì để làm với đơn giản. Trong thời gian kỹ thuật, vòng phản hồi là quan trọng. Đôi khi quan trọng hơn nhiều so với thời gian chạy.
Stephan Eggermont

1
Chà, bạn đang nói rất mơ hồ (thời gian kỹ thuật không liên quan đến những gì đang được thiết kế, những hạn chế là gì, v.v ... vòng lặp phản hồi không liên quan đến những gì được đưa trở lại cho ai, v.v.), vì vậy tôi sẽ để thoát khỏi cuộc trò chuyện này hơn là giao dịch tài liệu tham khảo mật mã.

Không có gì mơ hồ ở đây. Hãy nhìn vào vòng lặp Aluminium, hoặc PDCA.
Stephan Eggermont

3
@user Vâng, bất kỳ dự án nào chạy một lần mất một tháng để viết và một phút để chạy, sẽ có tốc độ tổng thể tăng 0,0% (1 tháng + 1 phút so với 1 tháng) từ việc sử dụng PyPy, ngay cả khi PyPy nhanh hơn hàng nghìn lần. Stephan đã không tuyên bố rằng tất cả các dự án sẽ tăng tốc 0%.
gmatht

4

Để đơn giản hóa điều này: PyPy cung cấp tốc độ mà CPython thiếu nhưng hy sinh khả năng tương thích của nó. Tuy nhiên, hầu hết mọi người chọn Python vì tính linh hoạt và tính năng "bao gồm pin" của nó (khả năng tương thích cao), không phải vì tốc độ của nó (mặc dù vậy nó vẫn được ưa thích hơn).


16
"Bao gồm pin" có nghĩa là thư viện tiêu chuẩn lớn , AFAIK
tshepang

4

Tôi đã tìm thấy các ví dụ, trong đó PyPy chậm hơn Python. Nhưng: Chỉ có trên Windows.

C:\Users\User>python -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)"
10 loops, best of 3: 294 msec per loop

C:\Users\User>pypy -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)"
10 loops, best of 3: 1.33 sec per loop

Vì vậy, nếu bạn nghĩ về PyPy, hãy quên Windows. Trên Linux, bạn có thể đạt được sự tăng tốc tuyệt vời. Ví dụ (liệt kê tất cả các số nguyên tố từ 1 đến 1.000.000):

from sympy import sieve
primes = list(sieve.primerange(1, 10**6))

Điều này chạy nhanh hơn 10 lần (!) Trên PyPy so với Python. Nhưng không phải trên cửa sổ. Có nó chỉ nhanh gấp 3 lần.


Hấp dẫn! Một số so sánh và số liệu sẽ là tuyệt vời.
ben26941

1

PyPy đã có hỗ trợ Python 3 trong một thời gian, nhưng theo bài đăng HackerNoon này của Anthony Shaw từ ngày 2 tháng 4 năm 2018 , PyPy3 vẫn chậm hơn nhiều lần so với PyPy (Python 2).

Đối với nhiều tính toán khoa học, đặc biệt là tính toán ma trận, numpy là lựa chọn tốt hơn (xem Câu hỏi thường gặp: Tôi nên cài đặt numpy hay numpypy? ).

Pypy không hỗ trợ gmpy2. Thay vào đó, bạn có thể sử dụng gmpy_cffi mặc dù tôi chưa kiểm tra tốc độ của nó và dự án đã có một bản phát hành vào năm 2014.

Đối với các sự cố Project Euler, tôi sử dụng PyPy thường xuyên và đối với các phép tính số đơn giản thường from __future__ import divisionlà đủ cho mục đích của tôi, nhưng hỗ trợ Python 3 vẫn đang được thực hiện kể từ năm 2018, với đặt cược tốt nhất của bạn là Linux 64 bit. Windows PyPy3.5 v6.0, phiên bản mới nhất tính đến tháng 12 năm 2018, đang trong giai đoạn thử nghiệm.


0

Phiên bản Python được hỗ trợ

Để trích dẫn Zen của Python :

Tính dễ đọc.

Ví dụ: Python 3.7 đã giới thiệu dataclass và Python 3.8 đã giới thiệu fopes = .

Có thể có các tính năng khác trong Python 3.7 và Python 3.8 quan trọng hơn đối với bạn. Vấn đề là PyPy hiện tại không hỗ trợ Python 3.7 hoặc Python 3.8.

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.