Là lập trình trong Python nhanh hơn trong C, C ++ hay Java? [đóng cửa]


27

Có một niềm tin rộng rãi trong số các rằng ngôn ngữ càng năng động và lỏng lẻo, lập trình viên sẽ càng làm việc hiệu quả hơn. Guido van Rossum đã viết về năng suất lập trình bằng python vào năm 1998 và tìm kiếm trên web tôi vẫn thấy mọi người tham khảo yêu cầu chính xác này:

Về mặt cú pháp, mã Python trông giống như mã giả thực thi. Phát triển chương trình bằng Python nhanh hơn 5-10 lần so với sử dụng C / C ++ và nhanh hơn 3-5 lần so với sử dụng Java. Trong nhiều trường hợp, một nguyên mẫu của một ứng dụng có thể được viết bằng Python mà không cần viết bất kỳ mã C / C ++ / Java nào. Thông thường, nguyên mẫu có đủ chức năng và hoạt động đủ tốt để được phân phối như sản phẩm cuối cùng, tiết kiệm thời gian phát triển đáng kể. Đôi khi, nguyên mẫu có thể được dịch một phần hoặc toàn bộ sang C ++ hoặc Java - Bản chất hướng đối tượng của Python làm cho bản dịch trở thành một quy trình đơn giản.

Vấn đề này đã được đánh giá đúng đắn về mặt khoa học chưa? Nếu không phải vì thì có lẽ vì anh chị em ngôn ngữ scripting như , hay ?

Tôi không tìm kiếm sự hợp lý hóa, tương tự hoặc giải thích lý do tại sao nó có thể khó trả lời, trừ khi đó là ý kiến ​​của các nhà nghiên cứu hoặc chuyên gia đã dành thời gian để xem xét vấn đề.

Ban đầu tôi đã hỏi câu hỏi này tại hoài nghi.SE , và ai đó đề nghị tôi cũng nên hỏi nó ở đây.


25
Chà, vì bạn đã hạn chế tập hợp các câu trả lời có thể, tôi chỉ dám nhận xét bằng cách hỏi một câu hỏi khác cần được trả lời trước (imho): Có một số liệu đáng tin cậy và được đánh giá cao để đo lường "năng suất của một lập trình viên" không?
Paul Michalik

1
@Paul Michalik - Tôi cho rằng bất kỳ bài nghiên cứu nào về năng suất đều có định nghĩa đi kèm (nếu không sẽ rất khó đo). Vì vậy, nếu ai đó tham khảo nghiên cứu sẽ rất hữu ích nếu họ đưa định nghĩa vào câu trả lời. Có lẽ (tôi đoán) một số cách khác nhau hoàn toàn có thể chấp nhận được để đo lường năng suất, có lẽ "Thời gian cần thiết để vượt qua một số điều không mong muốn" sẽ là một trong số đó.
Kit Sunde

1
@Paul Michalik - Chắc chắn nhưng có bao nhiêu câu bạn đọc trong sách, blog, bài nói chuyện và bài viết từ các lập trình viên thực sự được thử nghiệm theo kinh nghiệm? Tôi chắc chắn có những cách tốt hơn hoặc xấu hơn để đo năng suất. Ví dụ. "Tiêu thụ / thời gian cà phê" có lẽ sẽ còn tệ hơn cả "Dòng mã / thời gian" cổ điển. Tôi sẽ giữ lại phán quyết về tuyên bố năng suất cụ thể mà chúng tôi đã thấy và có thể tranh luận về công trạng dựa trên điều đó. Yêu cầu về năng suất cũng không hoàn toàn sai, tôi chắc chắn "dòng mã / thời gian" đo lường điều gì đó khi mọi người không cố gắng phá hủy số liệu.
Kit Sunde

1
Bạn có thể quan tâm đến bài viết này: citeseerx.ist.psu.edu/viewdoc/iêu
DistantEcho

1
@ChrisF - Bạn có nói rằng quesiton này không áp dụng cho Lập trình viên.SE? Nó chắc chắn là để hoài nghi, và nó dường như cũng phù hợp ở đây. Tôi có ấn tượng rằng bạn không nên đọc cho đến khi tôi đọc một bình luận gần đây của Robert Cartaino về câu hỏi này: skeptics.stackexchange.com/q/1963/631 về cơ bản nói rằng nó hoàn toàn ổn nếu nó được cả cộng đồng quan tâm và Tôi chỉ làm điều đó sau khi được người dùng khác nhắc nhở làm như vậy. Xem xét rằng câu hỏi đang nhận được sự ủng hộ, có vẻ như đó cũng là một mối quan tâm đối với cộng đồng này.
Kit Sunde

Câu trả lời:


17

Bài viết 1 của Ousterhout về các ngôn ngữ kịch bản cho thấy rằng việc lập trình càng cao, lập trình viên càng có năng suất cao. Nếu chúng ta hiểu điều đó, như Boehm nói 2 , số dòng mà lập trình viên có thể viết trong một thời gian nhất định là không đổi và không phụ thuộc vào ngôn ngữ hoặc loại của nó (mức độ thấp, lập trình hệ thống, kịch bản), người ta có thể dễ dàng tin vào tuyên bố. Các hướng dẫn kết quả cho mỗi mã nguồn-dòng -ratio có thể là một thứ tự cường độ (hoặc một số) tốt hơn với các ngôn ngữ kịch bản so với các ngôn ngữ lập trình hệ thống.

Vì các ngôn ngữ kịch bản chủ yếu dựa vào các tiện ích được tạo sẵn cho các tác vụ thông thường (ví dụ: cấu trúc dữ liệu, thao tác chuỗi), công dụng chính của chúng thường là tăng năng suất với chi phí tốc độ chạy chậm hơn bằng cách cung cấp cú pháp dễ học và hiệu quả để bảo trì các chương trình với. Người ta không dùng đến ngôn ngữ kịch bản khi cần tốc độ thực thi cao nhất.

[1]: JK Ousterhout, Scripting: Lập trình cấp cao hơn cho thế kỷ 21 , Máy tính (IEEE), 1998
[2]: B. Boehm, Kinh tế kỹ thuật phần mềm , Hội trường Prentice, 1981


9
Mặc dù đây là một câu trả lời hay, nhưng đừng quên rằng các ngôn ngữ phi chữ viết hiện đại cũng có xu hướng đi kèm với các tiện ích làm sẵn giúp phát triển nhanh. C # đến với tâm trí. Bất cứ ai cảm thấy Python đều có nhiều tiện ích đóng hộp sẵn hơn C # chỉ đơn giản là biết Python tốt hơn C #. Trong thực tế, cả hai đều có một loạt các tiện ích "tích hợp" rộng lớn và có thể so sánh được.
Roman Starkov

@romkyns, đối với bất kỳ dự án không tầm thường nào, bạn cần viết rất nhiều mã. Ngay cả khi bạn có nhiều viên gạch Lego, Bionicles không thể kết hợp một cách kỳ diệu.

2
@Thor nhưng thực sự khá hữu ích khi có những viên gạch Lego đó ở phía trước, thay vì phải xây dựng một máy khoan dầu, nhà máy nhựa và máy đùn khối lego trước tiên.
Roman Starkov

2
cả c ++ và Java đều có các thùng chứa chung và c ++ 11 có một lib tiêu chuẩn đầy đủ như vậy cho các thuật toán sắp xếp và các trình lặp, v.v. Tôi không tin rằng ai đó lập trình python sẽ có lợi thế đáng kể. Hơn nữa, tôi dành phần lớn thời gian lập trình của mình để tìm ra những gì tôi cần làm, không phải gõ. Vì vậy, tôi nghĩ rằng chỉ cần đếm số lượng dòng cần thiết để thực hiện một điều không phải là một chỉ số rõ ràng về việc bạn sẽ lập trình viên nhanh như thế nào trong ngôn ngữ đó.
Sam Redway

7

Nếu bạn đo năng suất là "thời gian để viết một chương trình đơn giản cụ thể" thì nó phụ thuộc rất nhiều vào kinh nghiệm lập trình và trí óc nhanh nhạy hơn ngôn ngữ mà bạn đang thực sự đánh giá lập trình viên chứ không phải ngôn ngữ.

Tôi tin rằng các cuộc thi mã thời gian chỉ ra rằng ngôn ngữ không thực sự quan trọng đối với các loại nhiệm vụ đó. Không có một ngôn ngữ nào chiến thắng những thách thức như vậy dễ dàng hơn những ngôn ngữ khác (ít nhất là không nếu bạn cho phép sự phổ biến tương đối của các ngôn ngữ).

Nếu bạn đo hiệu suất là "hiệu quả của chương trình tốt nhất" được viết bằng một ngôn ngữ nhất định, thì nó thậm chí còn ít phụ thuộc vào ngôn ngữ hơn. Xem ví dụ về kết quả của cuộc thi Galcon AI . Người chiến thắng được viết bằng Lisp. Mục nhập Lisp tiếp theo, tuy nhiên, được xếp hạng # 280. Điều này cho chúng ta biết gì về sự phù hợp của ngôn ngữ để viết AI tuyệt vời một cách hiệu quả? Theo tôi, không có gì. Nó chỉ cho chúng ta biết rằng "bocsimacko" đã đưa ra và thực hiện các thuật toán hiệu quả nhất. Đối với hồ sơ, thời gian không phải là một yếu tố chính trong cuộc thi này - mọi người đã có hơn hai tháng để phát triển mã của họ.

Cuối cùng, nếu bạn đo lường hiệu suất là "chi phí dài hạn để duy trì dự án" thì tôi nghĩ bạn đang tham gia vào một cái gì đó. Đặc biệt nếu bạn chỉ thuê những người giỏi nhất cho công việc và tính chi phí tính theo giờ thay vì đô la. Tôi có một quan điểm mạnh mẽ về ngôn ngữ nào là tốt nhất cho việc này, nhưng không có bằng chứng cứng nhắc nào để liên kết bạn với tôi sẽ loại bỏ ý kiến ​​này. Có lẽ ai đó có liên kết cho loại hiệu suất này.


7
"Bạn đang thực sự đánh giá lập trình viên chứ không phải ngôn ngữ" - Không nếu điều này thực sự được thực hiện một cách khoa học. Lấy 100 lập trình viên. Chọn một dự án chung, chẳng hạn như "Viết ứng dụng lịch với các yêu cầu cụ thể này". Các yêu cầu gắn liền với thử nghiệm đơn vị tự động. 50 lập trình viên viết ứng dụng bằng C ++, 50 bằng Python, được chọn ngẫu nhiên để các nhà phát triển chất lượng được phân tán đồng đều. Kết quả sẽ là một điểm số kết hợp thời gian trung bình để hoàn thành với số lượng bài kiểm tra đơn vị được thông qua. So sánh trung bình của kết quả Python với mức trung bình của kết quả C ++ và ... KHOA HỌC!
Morgan Herlocker

2
@Prof Có thể nếu bạn nhận được một nghìn mỗi ... nhưng vẫn vậy, làm thế nào để bạn kiểm soát thực tế rằng chỉ những người có tư duy nhất định và khả năng nhất định mới biết C ++?
Roman Starkov

bạn có thể làm cho mẫu của bạn chỉ lấy từ những người có thể vượt qua bài kiểm tra trình độ thành thạo C ++ và Python. Rất nhiều giáo sư cũ của tôi đã làm những nghiên cứu rất giống nhau. Ngoài ra, bạn đưa ra một số giả định mà những người khác đã thảo luận ở đây: lập trình
viên.stackexchange.com / q / 73715/3792

6

http://page.mi.fu-berlin.de/prechelt/Biblio/jccpprtTR.pdf là một trong số ít nghiên cứu mà tôi biết rằng đã so sánh trực tiếp thực tế giữa năng suất trong các ngôn ngữ khác nhau. Nó đã cũ, nhưng đáng đọc nếu bạn thấy chủ đề thú vị. Việc so sánh có một số thiếu sót lớn mà bài báo rất trung thực.

Kết quả chung là các ngôn ngữ cấp thấp (ví dụ C, C ++) mất nhiều thời gian hơn để viết, có thể chiếm ít bộ nhớ hơn và có thể chạy nhanh hơn nhiều. Nhưng với độ biến động rất cao. Các ngôn ngữ kịch bản cấp cao có xu hướng mất một nửa thời gian để viết và có ít thay đổi trong cách tiếp cận. Ở một mức độ đáng ngạc nhiên ban đầu, có xu hướng rõ ràng là làm một cái gì đó bằng ngôn ngữ kịch bản.

Lưu ý rằng tất cả các số hiệu năng cho Java phải được lấy bằng một hạt muối chính - bài báo được sản xuất vào những năm 90 trước khi mọi người có nhiều kinh nghiệm với Java và trước khi JVM được tối ưu hóa tốt. Cả hai yếu tố nên có tác động đáng kể.


1

Nói chung, viết một chương trình bằng Python thường sẽ nhanh hơn viết cùng một chương trình bằng C, C ++, Java.

Nó cũng có khả năng chạy chậm hơn.

Tất nhiên, có những ứng dụng cụ thể mà các ngôn ngữ khác có thể nhanh hơn vì một số nhiệm vụ liên quan được hỗ trợ 'nguyên bản' hơn.

Mặc dù tôi không biết về bất kỳ nghiên cứu nào để xác nhận sự gia tăng tốc độ / năng suất này (như một nhà bình luận đã đề cập, điều này có thể khó đo lường chính xác), đã có nghiên cứu trực tiếp về tính biểu cảm của ngôn ngữ.

Tôi nghĩ rằng có một số giá trị cho một mối tương quan giữa biểu cảm ngôn ngữ và tốc độ lập trình. Chỉ cần hình dung một mẫu lặp đơn giản và làm thế nào một sự hiểu biết về vòng lặp hoặc danh sách của Pythonic có thể ngắn gọn hơn. Nó không chỉ có thể được gõ nhanh hơn ngay lập tức mà còn giúp loại bỏ các mối lo ngại về các lỗi khác nhau, các chỉ số ngoài giới hạn và các vấn đề khác có thể làm chậm đáng kể quá trình mã hóa.

Điều này cho thấy một bảng ước tính cho tỷ lệ biểu cảm của các ngôn ngữ. Trong khi nó nên được thực hiện với một hạt muối, các chú thích mà nó đề cập là rất đáng giá.

http://en.wikipedia.org/wiki/Comparison_of_programming_lacular#Expressively


-5

Lần trước tôi đã sử dụng Java (một thời gian trước đã thừa nhận) nó đã mất một màn hình đầy mã để mở và ghi vào một tệp. So sánh điều đó với một vài dòng trong Python hoặc Perl và bạn có thể đoán dòng nào nhanh hơn.

Rõ ràng tất cả các ngôn ngữ đều có điểm mạnh và điểm yếu riêng, nhưng đối với hầu hết các nhiệm vụ, Python sẽ viết nhanh hơn.


6
"phải mất một màn hình đầy đủ của mã để mở và ghi vào một tập tin": Đặt này vào một lớp tiện ích với hai phương pháp write()read()và trong phần còn lại của Java truy cập tập tin dự án của bạn sẽ càng ngắn gọn càng bằng Python. Tôi nghĩ rằng ví dụ của bạn hơi quá hạn chế để so sánh Python và Java (mặc dù tôi đồng ý rằng Java có xu hướng dài dòng hơn).
Giorgio

Chắc chắn, nhưng Python, Perl và các ngôn ngữ cao hơn thường nghĩ về những thứ đó trước, và vì vậy bạn không cần phải viết các lớp tiện ích (hoặc không nhiều như chúng). Việc sử dụng một lớp tiện ích vẫn cần có thời gian và là một nguyên tắc của mã có thể tái sử dụng, áp dụng cả Java và Python hàng đầu tùy thuộc vào những gì bạn đang thực sự làm.
wobbily_col

Điều này giả định rằng Java cần 50 - 60 dòng mã chỉ để mở và viết một tệp. Điều này chỉ đơn giản là không chính xác.
h22
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.