Năng suất Python VS Năng suất Java


24

Trên SO tôi đã bắt gặp một câu hỏi liên quan đến nền tảng nào, Java hoặc Python là tốt nhất để phát triển trên Google AppEngine. Nhiều người đã tự hào về năng suất tăng lên có được từ việc sử dụng Python trên Java. Một điều tôi sẽ nói về đối số năng suất của Python so với Java, là Java có IDE tuyệt vời để tăng tốc độ phát triển trong khi Python thực sự thiếu trong lĩnh vực này vì tính chất động của nó.

Vì vậy, mặc dù tôi thích sử dụng Python làm ngôn ngữ, tôi không tin rằng nó mang lại hiệu quả tăng năng suất so với Java, đặc biệt là khi sử dụng một khung công tác mới. Rõ ràng nếu đó là Java vs Python và trình soạn thảo duy nhất bạn có thể sử dụng là VIM thì Python sẽ giúp bạn tăng năng suất rất lớn nhưng khi IDE được đưa vào phương trình thì nó không rõ ràng lắm.

Tôi nghĩ rằng giá trị của Java thường chỉ được đánh giá ở mức độ ngôn ngữ và thường dựa trên các giả định đã cũ nhưng Java có nhiều lợi ích bên ngoài ngôn ngữ, ví dụ JVM (thường bị chỉ trích nhưng cung cấp tiềm năng lớn), các công cụ và IDE tuyệt vời, số lượng lớn thứ ba thư viện đảng, nền tảng vv.

Câu hỏi, Python / ngôn ngữ động có liên quan có thực sự mang lại sự tăng năng suất khổng lồ thường được nói đến không? (với sự cân nhắc được đưa ra để sử dụng các khung công tác mới và làm việc với các ứng dụng từ trung bình đến lớn).


2
Kiểm tra IDE PyCharm. Nhưng tôi cũng tin rằng có một số khung mới cho GAE chuyển đổi mã Java thành JavaScript để sử dụng ở mặt trước, đây có thể là một mức tăng năng suất lớn.
Andrew M

14
IDE hay không, bạn vẫn phải viết 10 dòng Java cho một số điều có thể được thực hiện (tốt) trong một dòng của Python.

2
Đừng xấu hổ về tình yêu của bạn dành cho Java. Bạn đã học được một vài thủ thuật (IDE, thư viện và khung công tác) cho phép bạn đá vào mông. Nắm lấy nó. Bạn không cần sự cho phép của chúng tôi để trở nên tuyệt vời. Nếu Java làm cho bạn hiệu quả, vậy là đủ.
Scant Roger

1
1) Tiềm năng JVM rất hạn chế . Thong thả. Nó không phải là "xấu", nó chỉ là, tốt, hạn chế. 2) IDE chỉ có thể trợ giúp nếu tất cả những gì bạn làm là tích hợp hàng trăm thành phần hiện có (đây là một loại lập trình hợp lệ và được tôn vinh, nhưng không phải là duy nhất). Khi nói đến việc thực hiện các thuật toán phức tạp, Python có năng suất cao hơn nhiều so với Java (ngay cả những thứ như hàm lambda và việc hiểu danh sách cũng tạo ra sự khác biệt rất lớn).
SK-logic

1
Nếu năng suất của bạn được tăng lên đáng kể bởi IDE của bạn, thì có khả năng là có điều gì đó cực kỳ sai trái với bạn hoặc nền tảng lập trình của bạn. (Smalltalk là ngoại lệ này, bởi vì nó tạo ra một hệ thống phản xạ toàn bộ để lập trình).
Marcin

Câu trả lời:


18

Một trong những ưu điểm chính của Python là triết lý "bao gồm pin" của nó: một thư viện tiêu chuẩn rộng rãi và đơn giản để sử dụng. Trong Java, chỉ cần đọc một tệp văn bản yêu cầu một số dòng mã, các trình đọc lồng nhau và như vậy. Trong Python nó f.read(). Đây chắc chắn sẽ là một sự tăng năng suất rất lớn, đặc biệt là trong việc tạo mẫu nhanh. Python ngôn ngữ nói chung cũng ít dài dòng hơn, đó không phải là một điều xấu (mặc dù tôi nghĩ tầm quan trọng của tính dài dòng so với sự ngắn gọn thường được nhấn mạnh quá mức).

Tuy nhiên, nếu bạn đã làm việc trên một số khung, chẳng hạn như GAE, thì tôi sẽ mong đợi sự khác biệt sẽ nhỏ hơn nhiều và chủ yếu là thông thạo ngôn ngữ cá nhân. Bạn sẽ chủ yếu chỉ kết nối khung công tác cùng với cú pháp của sự lựa chọn của bạn và có thư viện tiêu chuẩn tuyệt vời của Python giúp ích rất ít.


Tôi thực sự cần học cách sử dụng GAE. Bất kỳ loạt hướng dẫn trực tuyến bạn muốn giới thiệu? Tôi quen thuộc với Python, nhưng không có manh mối về GAE. Cảm ơn!


4
Hoặc bạn có thể thêm Apache Commons IO với một dòng cấu hình Maven và sau đó đọc các tệp trong một dòng. Cách tiếp cận bao gồm pin là con dao hai lưỡi đối với tôi.
nhảy lên

@jiggy: Tôi đồng ý ở một mức độ nào đó; Pin của Python hầu như luôn hữu dụng và thường là đủ, nhưng rõ ràng thư viện tiêu chuẩn không thể phục vụ cho tất cả các mục đích có thể, vì vậy đôi khi bạn phải quay lại thư viện.
Joonas Pulakka

2
Đọc một tệp văn bản trong java : List<String> lines = Files.readAllLines(Paths.get("file.txt"), Charset.forName("UTF-8"));. Không tệ lắm! (Đây là java 7 chưa được phát hành vào ngày 11 tháng 3).
assylias

19

Đây là 2 xu của tôi. Theo kinh nghiệm của tôi, Python tốt cho các dự án vừa và nhỏ trong khi với các dự án lớn hơn, tôi làm việc hiệu quả hơn với Java.

Nói chung, tôi có thể sử dụng một ngôn ngữ được gõ động như Python (hoặc PHP) cho các dự án nhỏ hơn: nó không quá phức tạp, bạn muốn thực hiện nhanh chóng và không có quá nhiều điều có thể sai. Trong trường hợp này, tôi thấy rằng Python có thể thực tế hơn để sử dụng.

Tuy nhiên, khi tôi phải phát triển một phần mềm lớn hơn, tôi thích một ngôn ngữ được gõ tĩnh như Java vì tôi thích trình biên dịch thực hiện càng nhiều kiểm tra càng tốt cho tôi. Kinh nghiệm của tôi là trong các dự án lớn hơn, tôi phải dành nhiều thời gian hơn để sửa lỗi với Python hơn là với Java, vì vậy tôi không bận tâm nếu phải viết thêm một chút để viết mã bằng Java vì điều này sẽ tiết kiệm thời gian sau này.


6
+1, hoàn toàn đồng ý. Tôi thích sử dụng Python và các ngôn ngữ tương tự trên các dự án nhỏ hơn, nơi tôi có thể quấn đầu quanh toàn bộ phạm vi của chúng mà không gặp nhiều rắc rối. Vấn đề xảy ra trong các dự án lớn hơn, nơi bạn phải suy ra giao diện giữa các thành phần. Điều này, kết hợp với hỗ trợ tái cấu trúc yếu hơn khiến tôi không tự tin trong việc sản xuất các hệ thống lớn, ổn định, có thể bảo trì. Rất nhiều bài kiểm tra phải được viết và duy trì, chỉ để bù cho việc thiếu phân tích tĩnh mà trình biên dịch thực hiện. Khi đến thời điểm này, lợi ích của việc lặp lại ban đầu nhanh chóng sẽ bị mất trong nguồn gốc.
bunglestink

Tôi sử dụng cả hai, và tôi thích cả hai. Tôi hoàn toàn đồng ý với bạn.
Daniel Baktiar

11

Tôi làm việc hiệu quả hơn trong các ngôn ngữ mạnh hơn như Python hoặc Ruby. Sẽ không thành vấn đề nếu một số mã Java có thể được tạo bởi IDE. Có nhiều mã để đọc và duy trì. Phải mất nhiều thời gian hơn để lội qua mã lặp đi lặp lại và tìm các phần quan trọng, và nhiều thời gian hơn để thay đổi nó. Thật tốt khi Eclipse có thể chuyển đổi

private Date dateOfBirth;

đến:

private Date dateOfBirth;
public Date getDateOfBirth() { return dateOfDeath; }
public setDateOfBirth(Date d) { dateOfBirth = d; }

nhưng mỗi lần mở lớp tôi sẽ thấy thứ rác rưởi đó và phải lướt qua nó để tìm những phần thú vị. Ngoài ra, trong quá trình bảo trì, lỗi có thể được đưa vào mã được tạo.

Tôi rất muốn thấy:

attr :date_of_birth

Đối với tôi, nhu cầu về một IDE để hoạt động hiệu quả với Java là một lý do chính đáng để chọn ngôn ngữ khác.

Có lẽ mạnh mẽ hơn, so sánh mã Ruby này:

avg = people.filter { |p| p.height > 200 }.collect(:weight).average

chống lại mã Java tương tự:

List<Double> weights = new ArrayList<Double>();
for (Person p: people) {
  if (p.getHeight() > 200) {
    weights.add(p.getWeight());
  }
}
return Stats.average(weights);

Mã Ruby là bản dịch trực tiếp của đặc tả: trọng lượng trung bình của những người cao hơn 200 (cm). Một bình luận sẽ là hoàn toàn dư thừa.

Mã Java yêu cầu công việc đáng kể để viết và đọc.

Paul Graham đưa ra một lập luận thuyết phục cho sự ngắn gọn trong các ngôn ngữ lập trình trong bài tiểu luận này . Sau khi thực hiện một số toán học ở trình độ sau đại học, tôi thấy lập luận của mình hấp dẫn và các lập luận chống lại sự yếu kém. Chắc chắn một dòng trong một ngôn ngữ cấp cao có thể khó hiểu hơn một dòng trong ngôn ngữ cấp thấp, giống như một phương trình vi phân một phần khó hiểu hơn một bổ sung đơn giản. Nhưng một dòng trong một ngôn ngữ mạnh mẽ sẽ dễ hiểu hơn năm hoặc mười dòng mà nó thay thế. Hãy tưởng tượng đọc một văn bản toán học được viết bằng các từ thay vì các ký hiệu.


Tôi chưa sử dụng Python, nhưng đã sử dụng C # có thuộc tính tự động. Python có bao nhiêu công việc để thêm logic vào đó (giả sử bắn một sự kiện hoặc logic xác thực)?
mlk

@mlk - Câu lệnh "attr" là của Ruby. Trong Ruby rất đơn giản để đính kèm hành vi khi một thuộc tính được đặt.
kevin cline

Trong python, tất cả các thuộc tính lớp được tự động công khai, vì vậy hầu hết thời gian bạn sẽ truy cập chúng trực tiếp.
Zhehao Mao

3
Python không cần getters hoặc setters - chỉ cần dateOfBirthcông khai. Nếu logic cần được thêm vào sau này trên get hoặc set, hãy thêm a _dateOfBirthđể lưu trữ dữ liệu, sau đó tạo một propertytên dateOfBirthcó cả hai phương thức get và set. Mã gọi hoàn toàn không cần thay đổi trong Python. Java chỉ sử dụng các hàm truy cập vì nó không có khái niệm "thuộc tính".
Izkata

1
Với Java 8 và các luồng trọng lượng trung bình của bạn có thể được viết như sau:people.stream().filter(p -> p.getHeight() > 200).mapToDouble(Person::getWeight).average().orElse(0);
vitro

7

Tôi đã chuyển từ Java sang Python vài năm trước và cá nhân tôi cảm thấy rằng tôi làm việc hiệu quả hơn. Như @Joonas chỉ ra, rất nhiều năng suất đến từ thư viện đóng gói. Nhưng một số trong đó là từ chính ngôn ngữ. Tôi không thể tưởng tượng việc không có từ điển, hiểu danh sách, chức năng bậc cao & vỏ.

Hãy nhớ rằng nếu bạn đã biết Java, sẽ mất một lúc để thành thạo Python.


7

Đây là một chút câu hỏi cũ nhưng tôi muốn thêm $ 0,03 của mình. Tôi nghĩ rằng nó phụ thuộc rất nhiều vào cách bạn nghĩ là tốt. Tôi đối với một người thực sự không thể đứng ngôn ngữ năng động, giải thích. Mặt khác, tôi là một fan hâm mộ lớn của các ngôn ngữ gõ tĩnh. Chắc chắn, sử dụng Java có thể dài dòng hơn nhưng tôi thấy việc đọc và duy trì dễ dàng hơn một khi tất cả đã nói và thực hiện. Tôi thấy Python, Ruby và Perl cực kỳ khó đọc (đối với tôi). Tôi chỉ không thể quấn đầu xung quanh nó mặc dù tôi đã thử. Điều đó nói rằng, tôi có thể viết mã bằng Scala tốt và nó không phải là vấn đề lớn. Tôi nghĩ rằng nó phụ thuộc vào những gì bạn cảm thấy thoải mái. Vào cuối ngày, Java sẽ mạnh hơn rất nhiều; nhiều hơn Ruby, Python hoặc Perl. JVM là một phần hấp dẫn của công nghệ và học cách khai thác sức mạnh của nó có thể chứng minh rất có lợi cho bạn.


1
Đồng ý, chắc chắn rằng bạn có thể hack với Python rất nhanh nhưng nó có thể trở thành cơn ác mộng để gỡ lỗi sau này hoặc thêm các tính năng mới, đó là lý do tại sao nó thường được gọi là "ngôn ngữ tạo mẫu" và đó là thứ tôi cảm thấy hữu ích cho (hoặc cho quảng cáo- loại kịch bản hoc)
chương trìnhx10

2
khi nào kết thúc ngày đó sẽ đến Chúng tôi đã chờ khoảng 20 năm và Java vẫn không có các hàm hạng nhất hoặc bất kỳ cơ sở lập trình meta nào. Trong khi đó, C # đã phát triển vượt bậc. Trong năm qua tôi đã bắt đầu viết mã Groovy thay vì Java và năng suất của tôi tăng lên rất nhiều. Mã Groovy nhỏ hơn và dễ hiểu hơn mã Java tương ứng vì nhiễu đã biến mất.
kevin cline

@Kevin Cline - Tôi biết bạn đang nói gì - Tôi đã là một nhà phát triển .NET trong sáu năm qua hoặc một cái gì đó. Tôi không chỉ nói về năng suất mà còn biên dịch thời gian, đồng thời và công cụ đa lõi. Java và JVM (Groovy, Scala, v.v.) JVM là điều quan trọng nhất ở đây không nhất thiết phải là chính Java.
Nodey The Node Guy

2
@ programmx10 Khả năng duy trì mã Python của bạn phụ thuộc vào cách bạn đã viết nó. Nếu bạn đã tạo ra tất cả một loại bùn lớn thì dĩ nhiên bạn sẽ không thể gỡ lỗi. Mặt khác, nếu bạn đã tổ chức tốt mã của mình và tách chức năng của bạn thành các mô-đun và lớp, thì nó có thể dễ bảo trì (nếu không dễ dàng hơn) so với mã Java.
Zhehao Mao

5

Tôi thấy rằng Python, Ruby, Javascript và SQL có năng suất cao hơn nhiều so với các ngôn ngữ được biên dịch như Java vì các ngôn ngữ đó có vòng phản hồi rất nhanh. Bạn có thể chạy một vài dòng mã trên một dòng lệnh và ngay lập tức biết liệu mã đó có đúng hay không. Nếu nó ném ngoại lệ, bạn biết ngay lập tức. Với Java, bạn phải biên dịch, đóng gói và triển khai, thường có thể mất vài phút cho các hệ thống lớn và điều này dẫn đến một chu kỳ phản hồi rất chậm.

Chu kỳ phản hồi nhanh cho phép bạn nhanh chóng lặp lại một giải pháp tốt và đó là điều làm cho các ngôn ngữ động hiệu quả hơn.


ứng dụng tuyệt vời của thuật ngữfeedback loop
lưỡng cư

3

Gần đây tôi đã làm nhiều python hơn và đã là một lập trình viên java trong một thời gian dài và để phát triển hoàn toàn mới, tôi nghĩ rằng tôi khá hiệu quả hơn một chút về python. Rất nhiều điều khá đơn giản trong java có thể hơi tẻ nhạt, như xử lý tệp / luồng, đọc nội dung từ URL, tuần tự hóa XML, v.v. bằng "tẻ nhạt", ý tôi là điều gì khiến bạn mất 5 dòng mã trong java chỉ lấy một con trăn. tuy nhiên, sử dụng đúng công cụ, như ổi hoặc API bộ sưu tập khác, thực sự có thể giúp với điều này.

Tôi đoán tôi đang nói rằng một lợi thế của python là nó có nhiều tính năng mà bạn cần sử dụng thư viện của bên thứ 3 trong java để có được.

tất cả những gì đã nói, đối với một số điều tôi sẽ làm việc hiệu quả hơn trong java so với tôi có thể ở python, đặc biệt khi nói đến việc tái cấu trúc và làm việc với các cơ sở mã lớn, v.v.


1
Mặc dù vậy, Java là tất cả về các thư viện, với Python họ có rất nhiều phương thức, giống như PHP, đến mức khó có thể nhớ tất cả, với Java bạn chỉ cần tìm kiếm thư viện thích hợp và ít nhất bạn có các lựa chọn như với những gì bạn sử dụng
chương trìnhx10

1
@ programmx10 Bạn đang nói về cái gì? Python có rất nhiều thư viện cho tất cả các loại. Chỉ cần nhìn vào tài liệu cho thư viện tiêu chuẩn. Các thư viện Python được phân tách thành các mô-đun, giống như các thư viện Java được tách thành các gói.
Zhehao Mao
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.