Mã byte Python có nhanh hơn không

Tôi là một người theo chủ nghĩa sô vanh của các ngôn ngữ được biên dịch. tôi đã luôn luôn. Mặc dù các ngôn ngữ được giải thích có thể giúp nhà phát triển bắt đầu viết và kiểm tra mã nhanh hơn, nhưng tôi thấy trình biên dịch là khoản đầu tư dài hạn tốt nhất có thể. Theo cách tôi thấy, bạn nhận được ít nhất 2 lợi thế lớn khi mã của bạn được biên dịch

  • Bạn được kiểm tra tất cả mã của mình mỗi khi bạn thay đổi mã, ngay cả trước khi bạn có thể bắt đầu sử dụng mã đó
  • Bạn nhận được thời gian thực hiện nhanh hơn nhiều. Tùy thuộc vào các chi tiết cụ thể của các nhiệm vụ hiện tại, nó có thể dẫn đến chi phí cơ sở hạ tầng thấp hơn đáng kể, thậm chí có thể thấp hơn một mức độ lớn đối với các cài đặt có lưu lượng truy cập thực sự cao

Tốc độ biên dịch nhanh hơn bao nhiêu so với mã thông dịch là một trong những lý do chính khiến tôi viết bài này

Với sở thích được thừa nhận của tôi về các ngôn ngữ được biên dịch so với các ngôn ngữ được giải thích, tôi hiện đang đối mặt với một thách thức. Tôi đã kế thừa lượng mã khổng lồ mà tôi quan tâm, được viết hoàn toàn bằng Python, những triển khai được biết đến nhiều hơn và được kiểm tra dựa trên trình thông dịch mã, không phải trình biên dịch. Tôi phải làm gì với nó?

Định kiến

Trong blog này, tôi xem xét một số định kiến ​​mà tôi có bằng cách so sánh hiệu suất của các tác vụ khác nhau bằng các ngôn ngữ lập trình khác nhau. Java, Go và Python. Tại sao Python thì rõ ràng, đó là cái tôi đang đánh giá có nên thay thế hay không. Java vì tôi là người hâm mộ nó gần 2 thập kỷ, chứng kiến ​​nó trưởng thành, trong khi hiệu suất và chức năng ngày càng tốt hơn. Cuối cùng tôi đã đến trong 2 năm qua để bắt đầu sử dụng và thực sự thích Go. Mặc dù có những yếu tố của Java mà tôi vẫn còn thiếu trong Go, chẳng hạn như tính kế thừa lớp, cú pháp ngôn ngữ rõ ràng và nhỏ gọn, quá trình biên dịch và thực thi nhanh, mã được tạo ra nhỏ gọn và cách tiếp cận đồng thời dựa trên thói quen vượt trội của nó thực sự là

Một số định kiến ​​tôi đã đề cập là

  • Mã được biên dịch chạy nhanh hơn ít nhất một bậc so với mã được giải thích. Tôi dựa trên ý kiến ​​này dựa trên kinh nghiệm so sánh hiệu năng của mã Java trước và sau khi JIT biên dịch mã byte. Tôi đã tìm thấy mối quan hệ là khoảng 30 đến 1
  • Mã Go chạy nhanh hơn một chút so với Java. Tôi nhớ một số thử nghiệm trước đây được thực hiện trong công việc trước đây của mình cho thấy Go nhanh hơn Java tới 30% trong một số tác vụ, nhưng tôi đã đọc các blog gần đây khẳng định Java nhanh hơn Go một chút
Bài kiểm tra đầu tiên

Tôi đã tận dụng mã java trong một bài viết khác mà tôi đã viết gần đây. https. //trung bình. com/@rodrigo. javier. ramirez/hiểu-java-jit-compiler-787f87daa110. Tôi đã viết lại bằng Python và Go và so sánh kết quả. Mã tính toán và in thời gian thực hiện tính bằng nano giây của 200 đợt, mỗi đợt thực hiện 50 lần số fibonacci là 100

Mã được sử dụng để tạo kết quả có thể được tìm thấy tại. https. //github. com/rodrigoramirez/fibonacci

Đầu ra, bỏ qua các dòng đầu tiên cho từng Java, Go và Python trông giống như

Java   Go    Python
...
122 123 11683
119 107 11539
123 104 11358
120 115 11926
119 118 11973
120 104 11377
109 103 12960
127 122 15683
112 106 11482
...

Thời gian trung bình tính bằng nano giây, bỏ qua lại các dòng ban đầu là

Java   Go    Python
130 105 10050

Vì vậy, việc tính toán các số fibonacci Mã Java chậm hơn một chút so với mã Go, lần này chậm hơn khoảng 24%. Mặt khác, Python chậm hơn gần 100 lần so với Go, chậm hơn 9458% theo thử nghiệm của tôi

Thử nghiệm này đã xác nhận những ý tưởng ban đầu của tôi về Java và Go. Nhưng thật là một bất ngờ khó chịu khi thấy Python hoạt động kém hơn bao nhiêu. Không phải tệ hơn một bậc, như tôi nghi ngờ, mà là hai

Tôi tự hỏi với kết quả như thế này tại sao Python lại được sử dụng nhiều như vậy?

Ý nghĩ đầu tiên xuất hiện trong đầu là nhiều người quan tâm nhiều hơn đến tính đơn giản của mã và khả năng đạt được kết quả nhanh chóng hơn là hiệu suất và chi phí dài hạn. Tôi tin rằng đây là trường hợp của các nhà khoa học dữ liệu;

Ý tưởng thứ hai đơn giản hơn là nhiều người không bao giờ đo lường hoặc so sánh kết quả của họ với các triển khai thay thế. Với rất nhiều công ty khởi nghiệp và sự cạnh tranh khốc liệt để đạt được điều gì đó, có lẽ giai đoạn tối ưu hóa không bao giờ đến

Tùy chọn thứ ba có thể là có nhiều cách để làm cho cùng một mã được viết bằng Python hoạt động nhanh hơn nhiều

Điều gì về Python đã biên dịch

Sau một số nghiên cứu, tôi quyết định thử nghiệm mã Python tương tự bằng PyPy, một triển khai Python được viết bằng Python, bao gồm trình biên dịch JIT giống như Java. Như với Java, chúng ta cần bỏ qua đầu ra ban đầu và bỏ qua phần được tạo trong khi mã vẫn đang được biên dịch JIT. Cắt theo đuổi bảng trung bình bao gồm một cột PyPy trông giống như

Java   Go    Python    PyPy
130 105 10050 1887

Mặc dù thời gian phản hồi trung bình khi sử dụng PyPy nhanh hơn 5 lần so với Python, nhưng nó vẫn chậm hơn 20 lần so với Go

Sự cần thiết của các xét nghiệm bổ sung

Bài kiểm tra trên là một bài kiểm tra chung tập trung vào số học số nguyên. Quay trở lại với code Python mà mình đã đề cập ở phần giới thiệu, mình sẽ cần chú ý đến

  • I/O thông qua Kafka, trình nghe HTTP và cơ sở dữ liệu
  • Phân tích thông điệp JSON
kết thúc

Bài viết này cho thấy rằng việc xử lý các phép tính số học đơn giản, mã được viết bằng Go nhanh hơn một chút so với đối tác Java của nó và nhanh hơn 2 bậc độ lớn so với việc diễn giải mã Python

Cá nhân tôi sẽ không thay thế một mã Java nổi tiếng và đã được thử nghiệm bằng mã Go tương đương chỉ dựa trên những kết quả này

Mặt khác, thử nghiệm cho thấy mã Python trên đường dẫn quan trọng có lưu lượng truy cập cao có thể không phải là một lựa chọn tốt. Nếu bạn gặp phải tình huống này, hãy cân nhắc sử dụng trình biên dịch Python như một giải pháp thay thế ngắn hạn

Để đưa ra quyết định cuối cùng về việc nên viết lại cái gì và khi nào, các yếu tố khác chưa được khám phá trong bài đăng này nên được xem xét, chẳng hạn như mức độ chuyên sâu của I/O so với mức độ chuyên sâu của CPU là mã có khả năng được viết lại

Từ các ý kiến

Nhận xét từ Shaun Dream khiến tôi nhận ra mã tôi đã viết cho Go và Java, sử dụng số nguyên 64 bit chỉ có thể tính toán fibonacci 92 trước khi kết quả bị gian lận do tràn số học. Phải nói rằng, theo ý kiến ​​​​của tôi, lý do và kết luận trong bài viết này vẫn có giá trị

Mã biên dịch Python có nhanh hơn không?

Biên dịch Python Mã máy mà bạn tạo khi biên dịch mã sẽ luôn chạy nhanh hơn mã byte được giải thích .

Là Python 3. 11 nhanh hơn Java?

Các chương trình Python thường chạy chậm hơn các chương trình Java, nhưng chúng cũng mất ít thời gian hơn để phát triển. Các chương trình Python thường ngắn hơn 3-5 lần so với các chương trình Java tương đương . Sự khác biệt này có thể là do các kiểu dữ liệu cấp cao tích hợp sẵn của Python và kiểu gõ động của nó.

Python có chạy mã nhanh hơn C không?

C là ngôn ngữ nhanh hơn so với Python vì nó được biên dịch . Các chương trình Python thường chậm hơn các chương trình C khi chúng được diễn giải. Trong C, loại của các biến khác nhau phải được khai báo khi chúng được tạo và chỉ các giá trị của các loại cụ thể đó phải được gán cho chúng.

Tại sao mã Python của tôi nhanh hơn C++?

C++ nhanh hơn Python vì nó được nhập tĩnh , dẫn đến việc biên dịch mã nhanh hơn. Python chậm hơn C++, nó hỗ trợ gõ động và nó cũng sử dụng trình thông dịch, khiến quá trình biên dịch chậm hơn.

Chủ Đề