Python nhanh hơn hay chậm hơn?

CPython đặc biệt chậm vì nó không có trình tối ưu hóa Just in Time [vì đây là triển khai tham chiếu và chọn tính đơn giản hơn hiệu suất trong một số trường hợp nhất định]. Unladen Swallow là một dự án để thêm JIT được LLVM hỗ trợ vào CPython và đạt được tốc độ tăng tốc lớn. Có thể Jython và IronPython nhanh hơn nhiều so với CPython cũng như chúng được hỗ trợ bởi các máy ảo được tối ưu hóa mạnh mẽ [JVM và. NET CLR]

Tuy nhiên, có một điều có thể khiến Python chậm hơn, đó là nó được nhập động và có rất nhiều tra cứu cho mỗi lần truy cập thuộc tính

Chẳng hạn, gọi f trên một đối tượng A sẽ gây ra các tra cứu có thể có trong __dict__, gọi tới __getattr__, v.v., sau đó cuối cùng gọi __call__ trên đối tượng có thể gọi được là f

Đối với gõ động, có nhiều cách tối ưu hóa có thể được thực hiện nếu bạn biết mình đang xử lý loại dữ liệu nào. Ví dụ: trong Java hoặc C, nếu bạn có một mảng thẳng các số nguyên mà bạn muốn tính tổng, mã hợp ngữ cuối cùng có thể đơn giản như tìm nạp giá trị tại chỉ mục i, thêm nó vào accumulator, sau đó tăng dần i

Trong Python, rất khó để tạo mã tối ưu như vậy. Giả sử bạn có một đối tượng lớp con danh sách chứa int. Trước khi thêm bất kỳ thứ gì, Python phải gọi A0, sau đó thêm nó vào "bộ tích lũy" bằng cách gọi A1, sau đó lặp lại. Hàng tấn tra cứu thay thế có thể xảy ra ở đây vì một luồng khác có thể đã thay đổi, ví dụ như phương thức A2, lệnh của thể hiện danh sách hoặc lệnh của lớp, giữa các lệnh gọi add hoặc getitem. Ngay cả việc tìm bộ tích lũy và danh sách [và bất kỳ biến nào bạn đang sử dụng] trong không gian tên cục bộ cũng gây ra tra cứu chính tả. Chi phí tương tự này áp dụng khi sử dụng bất kỳ đối tượng nào do người dùng xác định, mặc dù đối với một số loại tích hợp, nó được giảm nhẹ phần nào

Cũng cần lưu ý rằng các kiểu nguyên thủy như bigint [int trong Python 3, long trong Python 2. x], list, set, dict, v.v., là những thứ mọi người sử dụng nhiều trong Python. Có rất nhiều hoạt động được tích hợp sẵn trên các đối tượng này đã được tối ưu hóa đủ. Ví dụ: đối với ví dụ trên, bạn chỉ cần gọi A3 thay vì sử dụng bộ tích lũy và chỉ mục. Bám sát những điều này và một chút xử lý số với int/float/complex, nhìn chung bạn sẽ không gặp vấn đề về tốc độ và nếu bạn gặp phải vấn đề này, có thể có một đơn vị thời gian quan trọng nhỏ [ví dụ: hàm thông báo SHA2] mà bạn có thể . Thực tế là khi bạn viết mã C hoặc C++, bạn sẽ lãng phí rất nhiều thời gian để làm những việc mà bạn có thể làm trong vài giây/dòng mã Python. Tôi muốn nói rằng sự đánh đổi luôn xứng đáng trừ trường hợp bạn đang làm một việc gì đó như lập trình nhúng hoặc lập trình thời gian thực và không đủ khả năng chi trả

Chọn Python làm ngôn ngữ lập trình chính có nhiều lợi thế rõ ràng, bao gồm hỗ trợ rộng rãi cho lập trình khoa học và thư viện AI

Tuy nhiên, có một số nhược điểm khi sử dụng Python trong môi trường thời gian thực. Bài đăng này là bài thứ hai trong loạt bài về việc chọn ngăn xếp công nghệ phần mềm cho một công ty hình ảnh y tế và sẽ mô tả ngắn gọn vấn đề chính về những hạn chế về hiệu suất, lý do của hiện tượng này và các phương pháp tiềm năng để giải quyết những vấn đề này

GIL cho phép thực hiện chỉ một luồng tại một thời điểm trong quy trình HĐH. Để thực hiện lập trình song song các tác vụ chuyên sâu của CPU, phải sử dụng các tính năng đa xử lý. Tuy nhiên, điều quan trọng cần lưu ý là việc tạo ra các quy trình mới, cũng như quá trình chuyển đổi ngữ cảnh, cần có thời gian.

Không giống như các ngôn ngữ lập trình phổ biến khác bao gồm C# hoặc JAVA, Python là ngôn ngữ được gõ động và thông dịch. Nó chậm chủ yếu do tính chất năng động và tính linh hoạt của nó

Cả C# và Java đều được biên dịch thành “Ngôn ngữ trung gian”, chẳng hạn như IL cho Java và CIL cho C# và sử dụng trình biên dịch JIT [chỉ trong thời gian] cho mã máy. Trình biên dịch JIT có thể thực hiện việc thực thi nhanh hơn bằng cách biết kiến ​​trúc CPU mục tiêu và cho phép thực hiện tối ưu hóa trong thời gian chạy. Trình tối ưu hóa JIT tốt sẽ xem phần nào của ứng dụng đang được thực thi thường xuyên và tối ưu hóa chúng

Ngoài ra, kiểu gõ tĩnh của các ngôn ngữ này cho phép trình biên dịch thực hiện nhiều tối ưu hóa hơn nữa

Tuy nhiên, cách gõ động của Python khiến nó khó tối ưu hóa, vì trình thông dịch có ít thông tin về mã hơn nhiều so với ngôn ngữ gõ tĩnh.

Hành động đầu tiên trong việc giải quyết vấn đề hiệu suất là xác định vị trí nút cổ chai. Trong hầu hết các trường hợp sử dụng, giới hạn tốc độ của Python sẽ không đáng chú ý. Khu vực bị ảnh hưởng nhiều nhất là các tác vụ sử dụng nhiều CPU, chẳng hạn như tính toán số

Dưới đây là một số giải pháp có thể áp dụng để giải quyết vấn đề này

  1. Đa xử lý để vượt qua giới hạn GIL
  2. Các thư viện bên ngoài nhanh hơn và giải phóng GIL, cho phép xử lý đa luồng
  3. Viết thư viện C++ của riêng bạn
  4. Numba, giúp tăng tốc Python bằng cách biên dịch JIT thành mã gốc

Một số thư viện bên ngoài như Numpy và Scipy sử dụng các triển khai C++ hiệu quả có thể tăng tốc các tác vụ tiêu chuẩn. Một vấn đề phát sinh khi các thư viện đó không thể cung cấp các giải pháp được triển khai trước cho các tính toán cụ thể

Một tùy chọn khác là viết thư viện C++ của riêng bạn và sau đó bọc nó bằng các công cụ, chẳng hạn như Boost. Python, để tạo API thân thiện với Python

Numba là trình biên dịch JIT dành cho Python giúp tăng tốc các hàm Python nặng tính toán và tập trung vào tính toán [e. g. vòng lặp]. Nó cũng hỗ trợ các thư viện tiêu chuẩn như Numpy, không giống như các trình biên dịch Python khác, cho phép mã được viết bằng Python mà không cần thay đổi. Sử dụng Numba chỉ yêu cầu thêm các trình trang trí vào các chức năng của bạn trong khi triển khai chúng trong Python thông thường

Trình trang trí Numba chứa khai báo các loại tham số chức năng và một số đối số cho việc thực thi Numba [e. g. lưu trữ kết quả chức năng, sử dụng GIL, v.v. ]

[nguồn]

Numba tạo mã máy được tối ưu hóa từ mã Python thuần túy bằng cơ sở hạ tầng trình biên dịch LLVM. Tốc độ mã khi sử dụng Numba có thể so sánh với mã tương tự trong C, C++ hoặc Fortran

Đầu tiên, hàm Python được lấy, tối ưu hóa và chuyển đổi thành biểu diễn trung gian của Numba. Sau đó, do kết quả của kiểu suy luận, nó được chuyển đổi thành mã có thể hiểu được LLVM. Mã này sau đó được đưa vào trình biên dịch JIT của LLVM để đưa ra mã máy. Quá trình biên dịch JIT cũng có thể được thực hiện ngoại tuyến để cải thiện hiệu suất

Python có thực sự chậm hơn không?

Trong bài viết này, chúng ta sẽ khám phá ra rằng Python không phải là một ngôn ngữ tồi mà chỉ là rất chậm . Nó được tối ưu hóa cho mục đích mà nó được xây dựng. cú pháp dễ dàng, mã dễ đọc và rất nhiều tự do cho nhà phát triển. Tuy nhiên, những lựa chọn thiết kế này làm cho mã Python chậm hơn các ngôn ngữ khác như C và Java.

Tại sao Python quá chậm?

Tóm lại. Vì vậy, tóm lại tất cả ở đây python chậm chủ yếu là do hai lý do chính. Một là ngôn ngữ kiểu động có nghĩa là, không giống như trong java, python không có khai báo biến và điều này khiến quá trình biên dịch khá lâu và đôi khi các biến bị thay đổi trong quá trình thực hiện. .

Python nhanh hơn hay chậm 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ó.

Có phải Python luôn chậm hơn C++ không?

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

Chủ Đề