Python có nhanh hơn và nhẹ hơn C ++ không? [đóng cửa]


90

Tôi luôn nghĩ rằng lợi thế của Python là khả năng đọc mã và tốc độ phát triển, nhưng việc sử dụng thời gian và bộ nhớ không tốt bằng C ++.

Những số liệu thống kê này khiến tôi thực sự khó khăn.

Kinh nghiệm của bạn cho bạn biết điều gì về việc sử dụng bộ nhớ và thời gian Python so với C ++?


18
Vì vậy, Pyhton đối với hầu hết các trường hợp này chậm hơn và sử dụng nhiều RAM hơn nhưng nguồn nhỏ hơn. Vấn đề chính xác là gì?
nuriaion

2
Tôi đoán tôi đã hiểu sai kết quả.
Alex

6
Điều thực sự thú vị là các bài kiểm tra C ++ vẫn 'tốt hơn' so với các bài kiểm tra C!
gbjbaanb

9
@gbjbaanb: Không làm tôi ngạc nhiên. C ++ đã thêm rất nhiều tính năng cho phép mã có thể nhanh hơn. Nếu bạn biết mình đang làm gì, C ++ có thể hiệu quả một cách kỳ lạ, hơn cả C. Nhưng niềm tin phổ biến rằng "C nhanh hơn C ++" là sai. (và ngay từ đầu câu hỏi không có ý nghĩa lắm)
jalf 29-04-09

1
Liên kết đã chết
Arn

Câu trả lời:


237

Tôi nghĩ rằng bạn đang đọc những số liệu thống kê đó không chính xác. Họ chỉ ra rằng Python chậm hơn C ++ khoảng 400 lần và ngoại trừ một trường hợp duy nhất, Python giống một bộ nhớ hơn. Tuy nhiên, khi nói đến kích thước nguồn, Python hoàn toàn thắng.

Kinh nghiệm của tôi với Python cho thấy cùng một xu hướng xác định rằng Python chậm hơn C ++ từ 10 đến 100 lần khi thực hiện bất kỳ xử lý số nghiêm trọng nào. Có nhiều lý do cho điều này, những lý do chính là: a) Python được thông dịch, trong khi C ++ được biên dịch; b) Python không có nguyên thủy, mọi thứ bao gồm các kiểu nội trang (int, float, v.v.) đều là đối tượng; c) một danh sách Python có thể chứa các đối tượng có kiểu khác nhau, vì vậy mỗi mục nhập phải lưu trữ thêm dữ liệu về kiểu của nó. Tất cả những điều này đều cản trở nghiêm trọng cả thời gian chạy và tiêu thụ bộ nhớ.

Tuy nhiên, đây không phải là lý do để bỏ qua Python. Nhiều phần mềm không yêu cầu nhiều thời gian hoặc bộ nhớ ngay cả với hệ số thời gian làm chậm 100. Chi phí phát triển là nơi Python chiến thắng với phong cách đơn giản và ngắn gọn. Sự cải thiện này về chi phí phát triển thường lớn hơn chi phí của tài nguyên bộ nhớ và cpu bổ sung. Tuy nhiên, khi không có thì C ++ sẽ thắng.


108
Ngoài ra, những người nói về việc Python chậm chạp trong việc bẻ khóa số nghiêm trọng đã không sử dụng các mô-đun Numpy và Scipy. Python thực sự đang phát triển mạnh mẽ trong lĩnh vực máy tính khoa học ngày nay. Tất nhiên, tốc độ đến từ việc sử dụng các mô-đun được viết bằng C hoặc các thư viện được viết bằng Fortran, nhưng theo tôi đó là vẻ đẹp của ngôn ngữ kịch bản.
Justin Peel

3
Tôi asure những gì bạn nói và điều này một liên kết đến chứng minh điều đó: blog.dhananjaynene.com/2008/07/...
ucefkh

2
Về: c) một danh sách Python có thể chứa các đối tượng có kiểu khác nhau, vì vậy mỗi mục nhập phải lưu trữ thêm dữ liệu về kiểu của nó. Danh sách python thực sự là một danh sách các con trỏ đến các đối tượng. Trong python, giá trị biết nó là kiểu, trong khi biến chỉ là một con trỏ đến "đối tượng giá trị chung" (do đó, các số chẵn là bất biến). Vì vậy, danh sách không lưu trữ các loại nội dung của nó - chỉ là con trỏ. Tuy nhiên, bạn đã đúng về chi phí bộ nhớ - python không phải lưu trữ kiểu và ngữ cảnh khác cho các giá trị thuộc bất kỳ kiểu nào.
Alex

nếu bạn nói về cpython..thì có, nhưng pypy trong hầu hết các trường hợp đều rất nhanh (có thể so sánh với java, tôi đoán là 1/3 tốc độ của java), các tập con của python nhanh gần như c ++ (xem shedskin)
Quonux

1
@JustinPeel Tôi đặt câu hỏi liệu điều đó có đúng không. ngay cả khi sử dụng rộng rãi numpyscipy, một pythoncơ sở mã lớn có khả năng có nhiều mã trong python thuần túy, khiến mọi thứ chậm hơn C++. một tập lệnh python đạt đến tốc độ của một C++tập lệnh khi tỷ lệ phần trăm Cmã của nó đạt đến 100, tại thời điểm đó, nó không còn là tập lệnh python nữa. Chắc chắn là python đang cất cánh, nhưng không phải vì nó nhanh bằng C++- vì nó dễ sử dụng hơn.
dbliss

132

Tất cả các cách sử dụng Python chậm nhất (> 100x) trên loạt đá luân lưu đều là các phép toán khoa học yêu cầu số lượng GFlop / s cao. Bạn KHÔNG nên sử dụng python cho những điều đó. Cách chính xác để sử dụng python là nhập một mô-đun thực hiện các phép tính đó và sau đó có một buổi chiều thư giãn với gia đình của bạn. Đó là cách của trăn :)


3
Ngày nay có một số trình biên dịch Python-to-C ++ , vì vậy Python có thể nhanh như C ++ trong một số trường hợp.
Anderson Green

26

Kinh nghiệm của tôi cũng giống như các điểm chuẩn. Python có thể chậm và sử dụng nhiều bộ nhớ hơn. Tôi viết nhiều, ít mã hơn và nó hoạt động lần đầu tiên với ít gỡ lỗi hơn nhiều. Vì nó quản lý bộ nhớ cho tôi, tôi không phải thực hiện bất kỳ công việc quản lý bộ nhớ nào, tiết kiệm hàng giờ đồng hồ theo dõi lỗi rò rỉ lõi.

Câu hỏi của bạn là gì?


Tôi chỉ thấy bối rối trước kết quả của các điểm chuẩn. Hóa ra tôi đã hiểu sai về chúng.
Alex

16

Kích thước nguồn không thực sự là một điều hợp lý để đo lường. Ví dụ: tập lệnh shell sau:

cat foobar

ngắn hơn nhiều so với Python hoặc C ++ tương đương của nó.


35
Và dễ dàng hơn nhiều để duy trì rằng các phiên bản Python hoặc C ++ dài hơn cũng vậy. Tôi cho rằng kích thước mã nguồn có ý nghĩa quan trọng, và đối với một số tác vụ đơn giản nhất định, các tập lệnh trình bao ngắn gọn là tốt.
S.Lott

Tôi cũng tin rằng kích thước mã nguồn quan trọng rất nhiều và đối với một số nhiệm vụ, Bash là công cụ phù hợp cho công việc. Xem một ví dụ hay so sánh một tập lệnh bash đơn giản với python tại đây: innolitics.com/articles/programming-languages/… (bạn cần cuộn xuống một chút). Tôi nghĩ rằng nó là một ví dụ phức tạp hơn một chút cat footer.
jdg

7

Ngoài ra: Psyco so với C ++ .

Đó vẫn là một so sánh tồi, vì dù sao thì các điểm chuẩn về nội dung số có xu hướng tập trung vào Python thuần túy. Một cách tốt hơn là so sánh hiệu suất của các ứng dụng thực tế, hoặc C ++ so với NumPy, để biết liệu chương trình của bạn có chậm hơn đáng kể hay không.


2
nói cách khác - vì công cụ số có tốc độ chậm hơn rất nhiều nên viết nó bằng C ++ và gọi nó từ Python :-)
igouy 30-04-09

1
Nếu bạn định sử dụng thư viện trong python để làm cho nó nhanh hơn, thì bạn cũng có thể sử dụng thư viện bẻ khóa số trong c ++. Bằng cách đó, bạn giữ được tính linh hoạt của c ++ mà không cần phải viết nhiều đoạn mã :)
SuperSim135

Đó là một cái chết vô nghĩa cấp thần . OP thực sự nói rằng thích Python vì tính dễ đọc và tiện lợi, tại sao ai đó lại trực tiếp sử dụng một ngôn ngữ mà họ ít thích hơn, khi họ có thể nhận được hầu hết các lợi ích về hiệu suất bằng cách nhờ các tác giả thư viện chăm sóc chúng cho anh ta? Mục đích của việc sử dụng thư viện là không phải tự mình thực hiện loại công việc mà họ tự làm tốt hơn, mà thư viện tình cờ là một ràng buộc gốc là một chi tiết tối ưu hóa / triển khai.
milimoose

6

Vấn đề ở đây là bạn có hai ngôn ngữ khác nhau giải quyết hai vấn đề khác nhau ... nó giống như so sánh C ++ với trình hợp dịch.

Python là để phát triển ứng dụng nhanh chóng và khi hiệu suất là một mối quan tâm tối thiểu.

C ++ không dành cho việc phát triển ứng dụng nhanh chóng và kế thừa tốc độ từ C - để lập trình cấp thấp.


3

Đó là vấn đề tương tự với ngôn ngữ lập trình được quản lý và dễ sử dụng như mọi khi - chúng chậm (và đôi khi ngốn bộ nhớ).

Đây là những ngôn ngữ để kiểm soát hơn là xử lý. Nếu tôi phải viết ứng dụng để chuyển đổi hình ảnh và cũng phải sử dụng Python thì tất cả quá trình xử lý có thể được viết bằng C ++ và được kết nối với Python thông qua các ràng buộc trong khi giao diện và điều khiển quy trình sẽ được xác định bằng Python.


Những thư viện đó đã được viết cho Python hoặc C hoặc Java, vậy tại sao không sử dụng một ngôn ngữ động để gắn kết chúng lại với nhau?
aoeu256

2

Tôi nghĩ những số liệu thống kê đó cho thấy Python chậm hơn nhiều và sử dụng nhiều bộ nhớ hơn cho những điểm chuẩn đó - bạn có chắc mình đang đọc chúng đúng cách không?

Theo kinh nghiệm của tôi, chủ yếu là viết các chương trình liên kết mạng và hệ thống tệp bằng Python, Python không chậm hơn đáng kể theo bất kỳ cách nào. Đối với loại công việc đó, lợi ích của nó lớn hơn chi phí của nó.


Thật. WHen hiệu suất là một vấn đề, điều mà python giỏi là liên kết các mô-đun bên ngoài hiệu suất cao với nhau hoặc tạo mẫu hệ thống và sau đó cho phép các nút thắt cổ chai (thường nằm sâu trong vòng lặp bên trong) được viết lại dưới dạng mô-đun C, v.v.
xan 29/04
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.