Python là một ngôn ngữ lập trình đa năng, dễ học nhờ cú pháp sáng sủa. Tuy nhiên, đằng sau vẻ ngoài đẹp đẽ đó lại ẩn chưa những điều mà không phải ai cũng biết. Để biết đó là những điều gì, chúng ta cùng tìm hiểu nhé?
Python là một script language và được viết bằng ngôn ngữ lập trình C. Khi bạn định nghĩa bất kì thứ gì trong Python thì thực chất bạn đang tạo ra một biến PyObject bên trong core của Python được viết bằng C.
Nó sẽ tạo ra con trỏ kiểu PyObject trỏ tới một vùng nhớ nào đó trong bộ nhớ heap để chứa dữ liệu của "thực thể Python" đó.
Mỗi lần bạn tạo một biến bất kì trong Python, GC của Python sẽ dọn dẹp bộ nhớ 1 lần, chi tiết có thể xem ở đây.
Quá trình này đã được các core developer của Python tối ưu cho việc chạy thường xuyên, nghĩa là tuy tần suất chạy GC nhiều nhưng mỗi lần chạy sẽ nhanh và tốn ít tài nguyên, ai quan tâm có thể đọc thêm về proposal ở đây
Vậy nên, bạn có thể tối ưu ứng dụng Python của mình chỉ bằng cách đừng tạo quá nhiều biến khi không cần thiết hoặc hạn chế định nghĩa hàm on-fly. Hãy nhìn thư viện redis cho Python họ tối ưu hiệu năng chỉ bằng cách giảm bớt việc tạo biến Speeding up the protocol parsing
Với nhiều người, khi nhắc đến Python, họ sẽ nghĩ ngay đến bản Python có thể install dễ dàng trên trang python.org. Tuy nhiên, đây chỉ là một trong nhiều bản implementation cú pháp của Python. Bản Python trên trang python.org có tên là CPython được implement bằng C (source code).
Ngoài ra, Python còn có các bản implementation khác như PyPy được viết bằng C, Jython được implement bằng Java, RustPython được implementation bằng Rust,...
Nói chung, cú pháp của Python sáng sủa nên rất nhiều developer muốn implement lại với lí do về hiệu năng hay thêm các tính năng họ muốn mà bản implement CPython gốc không cho phép.
Mình có implement một đoạn code để test tính năng multi-thread của Python ở đây và đây là kết quả:
Bạn có thể thấy rằng, với các công việc dùng nhiều CPU, multi-thread còn chậm hơn single thread do context-switching. Ngược lại, với các công việc không dùng nhiều CPU mà bị block do chờ kết quả IO như call API thì multi-thread vẫn sẽ có tác dụng tối ưu. Vậy do đâu?
Python có một khái niệm là GIL (Global Interpreter Lock), GIL dùng để lock toàn bộ data trong process nên do đó, tại 1 thời điểm, chỉ có 1 thread được chạy. Lí do cho việc này là để hạn chế deadlock, chi tiết các bạn có thể xem thêm ở đây
Ngược lại, block do IO có thể improve bằng multi-thread vì nếu thread có bị lock cũng không ảnh hưởng do lúc đó, nó không cần dùng với CPU mà chỉ bị block do chờ data từ IO.
Trải qua 5 năm làm việc với Python, mình khá tự tin để nói rằng Python thực sự là một ngôn ngữ đa dụng. Nhờ vào cú pháp sáng sủa mà nó được cộng đồng phát triển nhiều thư viện, ứng dụng trên nó.
Python có thể làm web cực nhanh và dễ dàng, một số đại diện tiêu biểu như Flask, Django hay gần đây là FastAPI mà mình đã viết bài về sự "nhanh" của nó ở đây. Python cũng có các công cụ hỗ trợ lập trình hiệu năng cao như C-API của CPython, Cython,..., qua đó vừa có được interface đẹp do cú pháp Python, vừa có được hiệu năng cao do các ngôn ngữ bậc thấp hơn cung cấp.
Python có thể dùng làm về Machine Learning, AI như scikit-learn, tensorflow, ... hay các tính toán khoa học như scipy, numpy, ... Mình thừa nhận rằng, đa phần các framework kể trên được viết bằng C/C++, Fortran,... nhưng do cú pháp sáng sủa, họ đã binding interface Python vào trong các thư viện để dễ sử dụng, qua đó thấy được lợi thế của một cú pháp đẹp đẽ.
Ngoài ra, Python có thể là các tác vụ như automation, testing, lập trình nhúng, IoT, game (làm những dạng game indie đơn giản), ... hay để tạo ra các plugin cho các phần mềm khác.
Qua bài viết này, mình hi vọng bạn sẽ có cái nhìn chi tiết và hiểu hơn về Python cũng như cách nó hoạt động phần nào.