Tại sao các thư viện Python "nhẹ" lại làm phình to Docker image của bạn
Bạn cài một thư viện được quảng cáo là nhẹ nhàng nhưng Docker image lại tăng thêm hàng trăm MB? Bài viết này sẽ giới thiệu pip-size, công cụ giúp bạn tính toán dung lượng thực tế của các gói Python bao gồm cả các thư viện phụ thuộc.

Cái bẫy "chỉ là một thư viện nhỏ"
Chúng ta đều đã từng gặp tình huống này. Bạn tìm thấy một gói Python (package) hứa hẹn giải quyết vấn đề của bạn với độ trễ tối thiểu. README ghi là "nhẹ gọn" (lightweight), số sao trên GitHub rất cao, và nhà phát triển khẳng định nó "chỉ vài kilobyte".
Vậy là bạn cài đặt nó, chạy dự án, và tự hỏi tại sao Docker image của bạn lại đột ngột tăng thêm 200MB.
Điều gì đã xảy ra?
Thực tế là gói thư viện đó rất nhỏ. Nhưng các thư viện phụ thuộc (dependencies) của nó thì không. Và những thư viện phụ thuộc đó lại phụ thuộc vào cái khác... Bạn có thể hình dung ra điều đó.
Khoảnh khắc nhận ra vấn đề
Tôi đang so sánh các thư viện HTTP cho một dự án mới. requests rất phổ biến, nhưng mọi người đều nói nó "nặng". Sau đó, tôi tìm thấy một thư viện khác tự nhận là "giải pháp thay thế nhẹ nhàng".
Nhưng linh cảm mách bảo tôi nên "kiểm tra lại". Vì thế, tôi đã xây dựng pip-size — một công cụ tính toán dung lượng tải xuống thực tế của các gói PyPI và các phụ thuộc của chúng, chỉ sử dụng PyPI JSON API. Không cần tải xuống, không cần chạy pip subprocess, chỉ có dữ liệu.
Cài đặt:
pip install pip-size
So sánh các thư viện HTTP một cách công bằng:
pip-size requests
pip-size httpx
pip-size aiohttp
Kết quả có thể sẽ khiến bạn bất ngờ:
| Gói thư viện | Kích thước gói | Tổng (kèm phụ thuộc) |
|---|---|---|
| requests | 63.4 KB | 620.4 KB |
| httpx | 71.8 KB | 560.0 KB |
| aiohttp | 1.7 MB | 2.6 MB |
httpx thường được marketing là giải pháp "hiện đại" thay thế cho requests, nhưng tổng dung lượng lại gần như giống hệt! Trong khi đó, aiohttp lớn hơn gấp 4 lần — điều này cũng dễ hiểu vì nó là một khung async hoàn chỉnh, không chỉ là một client.
Sự thật về Flask vs FastAPI
Đây là phần thú vị. Flask thường được gọi là "nhẹ nhàng", trong khi FastAPI bị gán mác "nặng nề". Hãy cùng kiểm chứng:
pip-size flask
pip-size fastapi
Kết quả:
| Framework | Kích thước gói | Tổng (kèm phụ thuộc) |
|---|---|---|
| Flask | 101.0 KB | 606.2 KB |
| FastAPI | 115.0 KB | 2.9 MB |
Flask thực sự nhỏ hơn — khoảng 5 lần nhỏ hơn FastAPI khi tính toán tất cả mọi thứ.
Tuy nhiên, cần lưu ý một sắc thái: Kích thước của FastAPI đến từ pydantic (2.4 MB), thứ mang lại khả năng xác thực dữ liệu mạnh mẽ và tài liệu API tự động. Bạn không chỉ nhận được một web framework — bạn nhận được một giải pháp API hoàn chỉnh.
Vì vậy, sự "nhẹ nhàng" phụ thuộc vào nhu cầu của bạn. Nếu bạn muốn sự đơn giản và khả năng kiểm soát, Flask chiến thắng. Nếu bạn muốn tài liệu tự động, xác thực và gợi ý kiểu dữ liệu (type hints), thì "trọng lượng" của FastAPI là một tính năng, không phải lỗi.
Các trường hợp sử dụng thực tế
1. So sánh công bằng các giải pháp thay thế
pip-size httpx
pip-size requests
pip-size aiohttp
Giờ bạn có thể so sánh "táo với táo" — không chỉ là kích thước gói, mà là toàn bộ cây phụ thuộc.
2. Kiểm toán gói của chính bạn
pip-size mypackage
Xem bạn đang thực sự gửi những gì đến người dùng. Đôi khi bạn sẽ bất ngờ đấy.
3. Tìm ra "kẻ gây nặng nề"
Khi dự án của bạn phát triển ngoài dự kiến, hãy chạy pip-size trên các phụ thuộc. Bạn sẽ tìm ra thứ nào đang chiếm phần lớn dung lượng.
4. Hiểu rõ các tùy chọn bổ sung (Extras)
pip-size "requests[security]"
pip-size "fastapi[standard]"
Xem chính xác mỗi tùy chọn bổ sung thêm bao nhiêu dung lượng so với gói cơ bản.
Tại sao điều này lại quan trọng?
Trong một thế giới mà:
- Docker image cần phải nhỏ gọn.
- Pipeline CI/CD cần phải nhanh chóng.
- Băng thông không miễn phí (đặc biệt ở các quốc gia đang phát triển).
- Khởi động nguội (cold starts) trong serverless rất quan trọng.
Việc biết chi phí thực sự của một phụ thuộc trước khi bạn cài đặt nó không phải là sự xa xỉ — mà là sự cần thiết.
Tổng kết
pip-size là mã nguồn mở (giấy phép MIT) và có sẵn trên PyPI. Nó sử dụng PyPI JSON API, lưu trữ phản hồi trong 24 giờ và hỗ trợ proxy nếu bạn cần.
Lần tới khi bạn thấy một gói thư viện được quảng cáo là "nhẹ nhàng", hãy chạy pip-size trước. Bản thân bạn trong tương lai (và người dùng của bạn) sẽ cảm ơn vì điều đó.
Bạn có bao giờ bị bất ngờ bởi các phụ thuộc ẩn của một gói thư viện nào chưa? Hãy cho tôi biết trong phần bình luận!
Liên kết:
- GitHub: github.com/mohammadraziei/pip-size
- PyPI: pypi.org/project/pip-size
Bài viết liên quan

Công nghệ
Dairy Queen tích hợp chatbot AI vào hệ thống drive-thru để tăng tốc độ phục vụ
17 tháng 4, 2026

Công nghệ
Nhà Trắng gặp gỡ Anthropic: Thảo luận về mô hình AI Mythos và rủi ro an ninh mạng
17 tháng 4, 2026

Công nghệ
Cursor đàm phán huy động hơn 2 tỷ USD với định giá 50 tỷ USD khi tăng trưởng doanh nghiệp bùng nổ
17 tháng 4, 2026
