C có hiệu quả hơn Python không?

Python là một trong những ngôn ngữ kịch bản được sử dụng nhiều nhất trong khoa học dữ liệu (DS) và máy học (ML). Theo ‘PopularitY of Programming Languages’ Python là ngôn ngữ được tìm kiếm nhiều nhất trên Google. Bên cạnh việc là một ngôn ngữ kết dính tuyệt vời để kết nối các giải pháp DS/ML khác nhau với nhau, nó còn có nhiều thư viện để hầu như làm bất cứ điều gì với dữ liệu

Trong khoảng một tháng, chúng tôi sẽ nhận được bản phát hành Python mới hàng năm. phiên bản 3. 11. Tôi khá hào hứng với phiên bản mới này vì tính năng chính của phiên bản này là tốc độ tăng đáng kể

Trên LinkedIn, tôi đã thấy một vài bài đăng của những người đang thử nghiệm phiên bản mới và kết quả của họ thật tuyệt vời. Nhưng phương pháp tốt nhất để cảm nhận Python 3 nhanh như thế nào. 11 thực sự là, là tự mình chạy thử nghiệm

Trong bài đăng này, tôi sẽ chia sẻ phân tích từng bước của mình về Python 3. 11. Tất cả mã có sẵn trên trang github của tôi

Ảnh của Spencer Davis trên Bapt

Điểm chuẩn một ngôn ngữ lập trình không hề nhỏ chút nào. Khi bạn đọc x nhanh hơn y, bạn nên luôn coi kết quả như muối bỏ bể. Một triển khai thuật toán có thể tốt hơn cho x trong khi một triển khai khác tốt hơn cho y. Đối với điểm chuẩn của chúng tôi, nó đơn giản hơn một chút vì chúng tôi đang thử nghiệm Python với Python, nhưng chúng tôi có thể đã chọn các phần tử từ ngôn ngữ chỉ bị ảnh hưởng một chút. Với suy nghĩ này, tôi muốn trình bày thuật toán mà tôi đã sử dụng để so sánh. ước tính của Pi bằng phương pháp Monte Carlo

The idea of this algorithm is simple but the first time a saw it during some mathematics course at the University it blew my mind. We have a square of size 2r and in this square we fit a circle of radius r. Now we take a random number generator that generates numbers on a plane: <-r, r>, <-r, r>. The ratio between the points that are on the circle and the points on the square (read: all points) is an approximation of the ratio of area, which we can use to approximate Pi. This is a bit more clear in the equation:

Hình 1. Nguồn gốc của phương pháp Monte Carlo để ước tính số Pi. Tỉ lệ giữa 2 diện tích là Pi/4 nên Pi xấp xỉ 4 lần N_circle / N_all. (hình ảnh của tác giả)

Trong Python, tôi đã tách ước tính thực tế từ tập lệnh thử nghiệm để tôi có thể lặp lại thử nghiệm và lấy giá trị trung bình. Không được hiển thị ở đây, nhưng tôi cũng đã tham số hóa tập lệnh bằng Argparse, một thư viện chuẩn để phân tích các đối số từ giao diện dòng lệnh (CLI). Mã Python trông như thế này

Tập lệnh này đã sẵn sàng để chạy, tuy nhiên, chúng tôi muốn sử dụng tập lệnh này để kiểm tra các phiên bản khác nhau của Python, không chỉ phiên bản hiện được cài đặt (hoặc kích hoạt). Cách dễ nhất để kiểm tra nhiều phiên bản Python là sử dụng Docker. Python duy trì nhiều hình ảnh docker. Đương nhiên, tất cả các phiên bản được hỗ trợ, nhưng cũng có một số phiên bản đã hết hạn sử dụng (EOL), chẳng hạn như 2. 7 hoặc 3. 2. Nó cũng có hình ảnh cho các ứng cử viên phát hành, chẳng hạn như phiên bản 3. 11. Để sử dụng Docker, bạn cần cài đặt nó. Trong Linux và Mac thì tương đối dễ, trong Windows tôi không chắc lắm nhưng có lẽ cũng không khó. Tôi khuyên bạn chỉ nên cài đặt docker CLI, máy tính để bàn quá cồng kềnh đối với tôi. Để chạy tập lệnh cục bộ trong môi trường Python được chứa, hãy chạy

docker run -it --rm \
-v $PWD/your_script.py:/your_script.py \
python:3.11-rc-slim \
python /yourscript.py

Để tự động hóa các bài kiểm tra cho các phiên bản khác nhau, tất nhiên chúng tôi cũng sẽ sử dụng Python. Tập lệnh này sẽ chỉ bắt đầu một vùng chứa với phiên bản Python cụ thể và thu thập kết quả sau đó. Không có gì đặc biệt

Khi chạy các bài kiểm tra này, con số tuyệt đối khác nhau giữa các máy, tùy thuộc vào bộ xử lý (nó là CPU nặng). Đây là kết quả cho 7 phiên bản Python chính gần đây nhất

The new Python 3.11 took 6.4605 seconds per run.Python 3.5 took 11.3014 seconds.(Python 3.11 is 74.9% faster)
Python 3.6 took 11.4332 seconds.(Python 3.11 is 77.0% faster)
Python 3.7 took 10.7465 seconds.(Python 3.11 is 66.3% faster)
Python 3.8 took 10.6904 seconds.(Python 3.11 is 65.5% faster)
Python 3.9 took 10.9537 seconds.(Python 3.11 is 69.5% faster)
Python 3.10 took 8.8467 seconds.(Python 3.11 is 36.9% faster)

Điểm chuẩn lấy trung bình 6. 46 giây cho Python 3. 11. So sánh phiên bản này với phiên bản trước (3. 10), tốc độ này nhanh hơn gần 37%. khá ấn tượng. Khoảng sự khác biệt tương tự là giữa phiên bản 3. 9 và 3. 10, làm 3. 11 nhanh hơn gần 70%. Tôi đã vẽ tất cả các lần trong hình 2

Hình 2. Thời gian lặp trung bình cho tất cả các phiên bản Python được thử nghiệm. (hình ảnh của tác giả)

Khi nói về tốc độ, chúng ta luôn có một người nói. nếu bạn muốn tốc độ tại sao không sử dụng C

C nhanh hơn nhiều so với Python. - một anh chàng đó

Trong khi C của tôi là một nhưng bị gỉ, tôi nghĩ dù sao thì tôi cũng sẽ thử. Tôi đã sử dụng GNU C++ vì nó đi kèm với một thư viện đo thời gian đẹp (chrono). Tìm mã bên dưới

Như chúng ta đã biết, C++ là một ngôn ngữ biên dịch nên chúng ta cần biên dịch mã nguồn trước khi sử dụng. Khi bạn đã cài đặt build-essentials điển hình, bạn có thể nhập

g++ -o pi_estimate pi_estimate.c

Sau khi biên dịch, chỉ cần chạy tệp thực thi bản dựng. Đầu ra phải như thế này

Pi is approximately 3.14227 and took 0.25728 seconds to calculate.
Pi is approximately 3.14164 and took 0.25558 seconds to calculate.
Pi is approximately 3.1423 and took 0.25740 seconds to calculate.
Pi is approximately 3.14108 and took 0.25737 seconds to calculate.
Pi is approximately 3.14261 and took 0.25664 seconds to calculate.
Each loop took on average 0.25685 seconds to calculate.

Và chúng tôi phải đồng ý với một anh chàng đó vì nó thực sự là như vậy (đọc. Rất nhanh. Chỉ mất 0. 257 giây để thực hiện cùng một vòng lặp mà chúng tôi đã lập trình bằng Python trước đây. Hãy thêm phần này dưới dạng một dòng trong biểu đồ trước của chúng tôi, được hiển thị trong hình 3

Hình 3. Các phiên bản Python so với cùng một điểm chuẩn được biên dịch trong C++. (hình ảnh của tác giả)

Bây giờ, sau khi đánh giá cao con số trước đó lâu hơn một chút, chúng tôi thấy rõ động lực mà Python đã đạt được. Kể từ phiên bản 3. 9, Python đã tăng tốc khoảng 35%. Các nhà phát triển Python đã đề cập rằng một vài phiên bản tiếp theo sẽ tăng tốc độ đáng kể, do đó, chúng tôi có thể cho rằng tốc độ này sẽ được giữ nguyên (yup, giả định siêu an toàn)

Bây giờ câu hỏi đặt ra là với đà cố định này thì khi nào Python sẽ vượt qua thời của C++. Đối với điều này, tất nhiên chúng ta có thể sử dụng phép ngoại suy để dự đoán thời gian lặp của các phiên bản Python tiếp theo. Những điều này có thể được nhìn thấy trong hình 4

hinh 4. Ngoại suy tốc độ Python -> Python 3. 14 sẽ vượt qua C++ về tốc độ. Kinh ngạc. (hình ảnh của tác giả)

Kết quả thực sự tuyệt vời. Giữ tốc độ này, Python 3. 14 sẽ nhanh hơn C++. Nói chính xác, thời gian vòng lặp sẽ là -0. 232 giây, vì vậy nó sẽ được thực hiện ngay trước khi bạn muốn thực hiện phép tính. Dường như có một lỗ hổng trong tính liên tục không thời gian nhưng những tính toán này rất vững chắc. Do đó, tôi nghĩ chúng ta có thể phải đặt câu hỏi về công trình của Einstein và những người bạn

từ chối trách nhiệm

Trong khi các điểm chuẩn này cho Python 3. 5. Trăn 3. 11 đều hợp lệ, tất nhiên phép ngoại suy chỉ là một trò đùa. Các số liệu kiểu XKCD có nghĩa là một lời nhắc bổ sung cho điều đó ;-)

Nếu bạn muốn chạy các thử nghiệm này hoặc thử nghiệm của riêng bạn trên các phiên bản Python khác nhau, hãy tải xuống mã trên trang Github của tôi

Python có thể hiệu quả như C không?

Vấn đề về tốc độ . Python allows for extremely fast prototyping speeds but is unable to compete with the run times of C++, C, Fortran, as well as several other compiled languages.

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

Chương trình Python được thông dịch (từng dòng mã Python phải được dịch sang mã máy khi chương trình đang chạy), điều đó có nghĩa là chương trình này không bao giờ nhanh bằng C . .

Tại sao C nhanh hơn Python?

C/C++ tương đối nhanh so với Python vì khi bạn chạy tập lệnh Python, trình thông dịch của nó sẽ diễn giải từng dòng tập lệnh và tạo đầu ra nhưng trong C, trình biên dịch trước tiên sẽ biên dịch nó và tạo đầu ra được tối ưu hóa đối với

Tại sao Python lại chậm hơn C?

Mã Python nội bộ được giải thích trong thời gian chạy thay vì được biên dịch thành mã gốc do đó chậm hơn một chút. Chạy tập lệnh Python v/s chạy mã C/C++. con trăn. Đầu tiên nó được biên dịch thành Byte Code. Mã Byte này sau đó được giải thích và thực thi bởi PVM (Máy ảo Python).