2009-04-29 50 views
64

Tôi đã luôn 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 thời gian và mức sử dụng bộ nhớ không tốt như của C++.Python có nhanh hơn và nhẹ hơn C++ không?

These stats đánh tôi thực sự khó khăn.

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

+14

Vì vậy, Pyhton dành cho 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. Chính xác thì vấn đề là gì? – nuriaion

+2

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

+4

Đ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

Trả lời

177

Tôi nghĩ bạn đang đọc những số liệu thống kê đó không chính xác. Họ cho thấy rằng Python là lên đến khoảng 400 lần chậm hơn hơn C++ và ngoại trừ một trường hợp duy nhất, Python là nhiều hơn một con heo bộ nhớ. Khi nói đến kích thước nguồn mặc dù, Python thắng phẳng.

Trải nghiệm của tôi với Python cho thấy cùng một xu hướng nhất định rằng Python có thứ tự chậm hơn từ 10 đến 100 lần so với C++ khi thực hiện bất kỳ việc thu thập số nào nghiêm trọng. Có nhiều lý do cho điều này, những lý do chính là: a) Python được hiểu, 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, vv) là các đối tượng; c) một danh sách Python có thể chứa các đối tượng thuộc loại khác nhau, vì vậy mỗi mục phải lưu trữ dữ liệu bổ sung về loại của nó. Tất cả những điều này đều cản trở cả thời gian chạy và mức tiêu thụ bộ nhớ.

Đây không phải là lý do để bỏ qua Python. Rất nhiều phần mềm không đòi hỏi nhiều thời gian hoặc bộ nhớ ngay cả với yếu tố chậm chạp 100 lần. Chi phí phát triển là nơi Python thắng với phong cách đơn giản và súc tích. Cải tiến này về chi phí phát triển thường vượt quá chi phí của các nguồn cpu và bộ nhớ bổ sung. Khi nó không, tuy nhiên, sau đó C + + thắng.

+82

Ngoài ra, những người nói về Python đang chậm chạp cho việc crunching số nghiêm trọng đã không sử dụng các mô-đun Numpy và Scipy. Python đang thực sự cất cánh trong máy tính khoa học những ngày này. 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 đó là vẻ đẹp của ngôn ngữ kịch bản theo ý kiến ​​của tôi. –

+2

Tôi đảm bảo những gì bạn đã nói và đây là một liên kết để chứng minh điều đó: http://blog.dhananjaynene.com/2008/07/performance-comparison-c-java-python-ruby-jython-jruby-groovy/ – ucefkh

+2

Về: * c) danh sách Python có thể chứa các đối tượng thuộc loại khác nhau, vì vậy mỗi mục phải lưu trữ dữ liệu bổ sung về loại của nó. * Danh sách python thực sự là danh sách các con trỏ tới các đối tượng. Trong python đó là giá trị mà biết đó là loại, trong khi biến chỉ là một con trỏ đến "đối tượng giá trị chung" (do đó, ngay cả các số 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ỏ. Mặc dù vậy, bạn đã đúng về chi phí bộ nhớ - python không phải lưu trữ kiểu và bối cảnh khác cho các giá trị thuộc bất kỳ kiểu nào. – Alex

22

Trải nghiệm của tôi giống với đ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 việc gỡ lỗi ít hơn nhiều. Kể từ khi nó quản lý bộ nhớ cho tôi, tôi không phải làm bất kỳ quản lý bộ nhớ, tiết kiệm giờ theo đuổi xuống rò rỉ lõi.

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

+0

Tôi chỉ bị nhầm lẫn bởi kết quả của điểm chuẩn. Hóa ra tôi đã hiểu sai chúng. – Alex

2

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

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

+0

Thật vậy. Khi hoạt động là vấn đề, python có ích gì là ràng buộc các mô-đun bên ngoài hiệu suất cao, hoặc tạo mẫu hệ thống và sau đó cho phép các nút cổ chai (thường nằm sâu trong vòng lặp bên trong) được viết lại thành mô-đun C. – xan

11

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

cat foobar 

là ngắn hơn nhiều so với một trong hai Python hoặc C++ tương đương.

+29

Và dễ dàng hơn nhiều duy trì các phiên bản Python hoặc C++ dài hơn. Tôi cho rằng kích thước mã nguồn không quan trọng, và đối với một số nhiệm vụ đơn giản, các kịch bản lệnh terse shell là tốt. –

+1

Đó là một điểm tốt. –

+0

Tôi cũng tin rằng kích thước mã nguồn rất quan trọng và đối với một số tác vụ, Bash là công cụ thích hợp cho công việc. Xem một ví dụ tốt đẹp so sánh một kịch bản bash đơn giản với python ở đây: http://innolitics.com/articles/programming-languages/#what-makes-programming-languages-different (bạn cần phải cuộn xuống một chút). Tôi nghĩ rằng đó là một ví dụ phức tạp hơn một chút so với "chân mèo". – jdg

6

Đồng thời: Psyco vs. C++.

Nó vẫn là một so sánh xấu, vì không ai có thể làm các tiêu chuẩn về công cụ số khó khăn có xu hướng tập trung vào trong Python tinh khiết. Một cái tốt hơn sẽ so sánh hiệu suất của các ứng dụng thực tế, hoặc C++ so với NumPy, để có được một ý tưởng cho dù chương trình của bạn sẽ chậm hơn đáng kể.

+1

nói cách khác - kể từ khi công cụ numbercrunchy là chậm hơn rất nhiều viết nó trong C + + và gọi nó từ Python :-) – igouy

97

Tất cả việc sử dụng Python chậm nhất (> 100x) trong loạt đá luân lưu là các hoạt động 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 anyways. 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 đó đi một buổi chiều thư giãn với gia đình bạn.Đó là là cách pythonic :)

+2

Ngày nay có một số [Python-to-C + + trình biên dịch] (https://stackoverflow.com/questions/4650243/ convert-python-program-to-cc-code), vì vậy Python có thể nhanh như C++ trong một số trường hợp. –

3

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

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

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

2

Đó là cùng một vấn đề 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 ăn nhớ).

Đây là những ngôn ngữ để kiểm soát thay vì xử lý. Nếu tôi phải viết ứng dụng để chuyển đổi hình ảnh và 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 quá trình sẽ chắc chắn là Python.