Python có bao giờ nhanh hơn C không?

Mặc dù Python là một ngôn ngữ năng động, dễ học với cú pháp đơn giản, nhưng nó tương đối chậm khi so sánh với các ngôn ngữ như Java, Go, C và C++

So sánh các khung phổ biến được xây dựng bằng Python (Django) và các ngôn ngữ như Go (Gin) cho thấy khung Go chạy nhiều yêu cầu hơn mỗi giây (114 963) so với Django (8 945);

Lý do cơ bản đằng sau việc mã Python thực thi chậm này là vì nó là ngôn ngữ viết động.

Ví dụ, Java là một ngôn ngữ được nhập tĩnh chạy tất cả các kiểm tra cần thiết và biên dịch mã trước khi chạy;

Mặt khác, Python là ngôn ngữ được biên dịch trong thời gian chạy bởi vì, là ngôn ngữ được viết động, bất kỳ loại hoặc giá trị biến nào cũng có thể thay đổi trong khi chương trình đang chạy. Vì lý do này, mã Python không thể được biên dịch trước và do đó, mã không thể được tối ưu hóa trong thời gian chạy như chúng ta có trong các ngôn ngữ cấp thấp như Java hoặc C

Một lý do khác đằng sau việc Python thực thi chậm so với các ngôn ngữ như Java hoặc C là vì Python là ngôn ngữ thông dịch - trong khi Java là ngôn ngữ máy

Một ngôn ngữ được giải thích như Python cần được chuyển đổi thành ngôn ngữ máy trước khi thực thi;

Ngay cả khi Python chậm hơn, nó có một cú pháp đơn giản và một số lượng lớn các thư viện và cộng tác viên. Điều này có thể giải thích một phần lý do tại sao nó được sử dụng trong nhiều lĩnh vực phổ biến và ít phổ biến hơn như các tác vụ dành riêng cho GPU như học máy và trí tuệ nhân tạo

Vì vậy, không có cách nào để làm cho Python nhanh hơn?

Có một số cách bạn có thể thực hiện để làm cho chương trình Python của mình nhanh hơn bằng cách sử dụng

Mô-đun đa xử lý

Python là ngôn ngữ không cho phép đồng thời thông qua đa luồng. Đa luồng cho phép các phần chương trình khác nhau chạy đồng thời trên các lõi CPU riêng biệt, giúp chương trình chạy nhanh hơn

Python có một khóa trình thông dịch toàn cầu không cho phép nó thực hiện đa luồng;

Mô-đun đa xử lý của Python bỏ qua khóa trình thông dịch toàn cầu và cho phép bạn có nhiều trình thông dịch chạy đồng thời để thực hiện chương trình Python của bạn nhanh hơn. Tuy nhiên, bạn có thể gặp sự cố với bộ nhớ dùng chung và khóa

tiện ích mở rộng C

Ngoài mô-đun đa xử lý, việc viết phần mở rộng C cho mã Python của bạn có thể cải thiện đáng kể thời gian chạy chương trình của bạn

Việc triển khai Python mặc định, CPython, được viết bằng C

Do đó, bạn có thể viết mã C dưới dạng phần mở rộng cho mã python của mình

C là ngôn ngữ cấp thấp nhanh sẽ giúp chương trình Python của bạn chạy nhanh hơn

Nhưng, cả hai phương pháp này cũng có nhược điểm của họ. Khó có thể chạy mô-đun đa xử lý một cách hiệu quả do chia sẻ và khóa bộ nhớ trong khi sử dụng phần mở rộng C;

Tuy nhiên, tất cả những điều này sắp thay đổi

Người tạo ra ngôn ngữ Python, Guido Van Rossum, đã tiết lộ kế hoạch giúp Python nhanh hơn để đóng góp cho Hội nghị thượng đỉnh ngôn ngữ Python ảo năm 2021 được tổ chức vào tháng 5

Để cải thiện Python 3 được phát hành gần đây. 10, kế hoạch tăng tốc Python lên gấp 2 lần sẽ bắt đầu với Python 3. 11

Trong bài thuyết trình đã xuất bản, Van Rossum giải thích rằng dự án cải thiện hiệu suất Python được xử lý bởi một "nhóm nhỏ do Microsoft tài trợ" như một phần trong cách Microsoft trả lại cho cộng đồng Python

Bài thuyết trình của Guido Van Rossum, Hội nghị thượng đỉnh ngôn ngữ Python ảo năm 2021

Ông đảm bảo rằng nhóm cũng sẽ chăm sóc bảo trì và hỗ trợ, và dự án sẽ là nguồn mở

Theo kế hoạch, Van Rossum chỉ ra rằng dự án tăng tốc Python sẽ diễn ra tuần tự, nhắm mục tiêu gấp 2 lần trong Python 3. 11 và tốc độ tối đa gấp 5 lần trong các bản phát hành Python tiếp theo

Bài thuyết trình của Guido Van Rossum, Hội nghị thượng đỉnh ngôn ngữ Python ảo năm 2021

Nhưng liệu nhóm có thể đạt được tốc độ này?

Van Rossum nói rằng họ không chắc chắn rằng họ sẽ đạt được gấp đôi, nhưng họ "lạc quan và tò mò"

Anh ấy đã đưa ra một số yếu tố ràng buộc mà họ phải làm việc vì đạt được tốc độ gấp đôi trong phiên bản 3. 11 có thể khó

Ông tuyên bố rằng bất kỳ thay đổi và cải tiến nào đối với Python không được phá vỡ tính ổn định của khả năng tương thích giao diện nhị phân ứng dụng (ABI); . Nó không được phá vỡ hoặc làm chậm các trường hợp cực đoan. Ông nói thêm rằng việc sửa đổi phải "giữ cho mã có thể duy trì được. "

Làm thế nào để họ có kế hoạch đạt được tốc độ gấp đôi trong Python 3. 11?

Trong các yếu tố ràng buộc, Rossum và nhóm dự án cải tiến Python đã xác định một số khía cạnh mà họ tự do thay đổi để đạt tốc độ gấp 2 lần trong phiên bản 3. 11

Vì trình biên dịch bytecode và trình thông dịch là các thành phần thay đổi trong mỗi phiên bản phát hành, nên đây là một ứng cử viên tuyệt vời để tối ưu hóa tốc độ mà không vi phạm bất kỳ điều gì

Ông đề xuất giới thiệu "trình thông dịch bytecode thích ứng, chuyên dụng"; . Điều này sẽ hoạt động giống như một bộ đệm nội tuyến giúp tăng tốc độ thực thi

Tối ưu hóa tốc độ được đề xuất khác cho Python 3. 11 bao gồm tối ưu hóa ngăn xếp khung, chứng minh tốc độ gọi hàm, thay đổi định dạng tệp pyc và thực hiện xử lý ngoại lệ hiệu quả hơn

Tùy thuộc vào những cải tiến về tốc độ mà nhóm có thể đạt được trong Python 3. 11, Rossum tuyên bố rằng có thể đạt được tốc độ gấp 5 lần, nhưng "chúng ta sẽ phải sáng tạo. "

Có cách nào hiệu quả để cải thiện tốc độ Python trước Python 3 không. 11?

Trăn 3. 11, được đề xuất đi kèm với các cải tiến giúp Python nhanh hơn, sẽ không được phát hành cho đến năm 2022. Trước đó, chúng ta cần tìm cách tăng tốc các chương trình Python của mình

Để tăng tốc các chương trình Python của bạn, chúng tôi có thể triển khai các mô-đun đa xử lý Python hoặc sử dụng mã C làm phần mở rộng Python, như đã giải thích trước đó

Bạn cũng có thể sử dụng trình biên dịch JIT chẳng hạn như Numba nếu bạn đang sử dụng NumPy

Numba là trình biên dịch JIT tức thời, sử dụng trình trang trí để chuyển đổi mã Python và NumPy thành mã máy. Nó hoạt động bằng cách biên dịch mã Python, thay thế trình thông dịch Python, sau đó làm cho các hàm Python biên dịch trực tiếp thành mã máy, do đó cải thiện tốc độ trong thời gian chạy

Numba dịch các hàm Python sang mã máy được tối ưu hóa trong thời gian chạy bằng thư viện trình biên dịch LLVM tiêu chuẩn ngành

Khi sử dụng Numba, bạn không cần thay thế trình thông dịch Python, chạy một bước biên dịch riêng hoặc thậm chí cài đặt trình biên dịch C/C++. Bạn chỉ cần áp dụng một trong các trình trang trí Numba cho hàm Python của mình và Numba sẽ thực hiện phần còn lại

from numba import jit
import random

@jit(nopython=True)
def monte_carlo_pi(nsamples):
    acc = 0
    for i in range(nsamples):
        x = random.random()
        y = random.random()
        if (x ** 2 + y ** 2) < 1.0:
            acc += 1
    return 4.0 * acc / nsamples

Các nhà phát triển API cũng có thể sử dụng FastAPI, một khung web hiện đại, nhanh (hiệu suất cao) để xây dựng API với Python 3. 6+ dựa trên gợi ý loại Python tiêu chuẩn. Điểm chuẩn của TechEmpower cho thấy các ứng dụng FastAPI chạy trong Uvicorn là một trong những khung Python nhanh nhất hiện có

TechEmpower đo lường và xuất bản các điểm chuẩn hiệu suất thường xuyên của một số nền tảng ứng dụng web, khung công tác đầy đủ và khung vi mô

Nếu bạn đã quen với Flask thì việc học FastAPI sẽ không tốn quá nhiều thời gian của bạn

from typing import Optional
from fastapi import FastAPI
app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

Đối với phát triển không phải API, nếu bạn muốn hoán đổi Django hoặc Flask phổ biến trong một số khối lượng công việc nhạy cảm với thời gian, bạn có thể xem xét các khung ít được sử dụng hơn như Falcon, Chai và apidaora. Theo dự án Web Frameworks Benchmark, Falcon (3), Chai (0. 12) và apidaora (0. 28) là 3 framework Python nhanh nhất dành cho Python 3. 9

Tại sao Python quá chậm so với C?

KHÓA THÔNG DỊCH VIÊN TOÀN CẦU (GIL) . Nó chậm chủ yếu là do tính năng động và tính linh hoạt của nó .

Python sẽ nhanh hơn bao giờ hết?

Trăn 3. 11 sẽ mang lại thành quả cho nỗ lực nhiều năm của CPython để biến Python trở thành ngôn ngữ lập trình nhanh hơn

Có ngôn ngữ nào nhanh hơn C không?

Ngữ nghĩa của Fortran nói rằng các đối số của hàm không bao giờ có bí danh và có một kiểu mảng, trong đó các mảng trong C là các con trỏ. Đây là lý do tại sao Fortran thường nhanh hơn C . Đây là lý do tại sao các thư viện số vẫn được viết bằng Fortran.