Ngôn ngữ lập trình nhanh hơn Python

Cập nhật ngày 14 tháng 5 năm 2019 để phản ánh rõ hơn những cải tiến dành cho Go trong 2 năm qua [quản lý gói, hiệu suất tốt hơn, thời gian biên dịch nhanh hơn và hệ sinh thái trưởng thành hơn] Chuyển sang ngôn ngữ mới luôn là một bước tiến lớn, đặc biệt khi chỉ có một thành viên trong nhóm của bạn . Đầu năm nay, chúng tôi đã chuyển ngôn ngữ lập trình chính của Stream từ Python sang Go. Bài đăng này sẽ giải thích một số lý do tại sao chúng tôi quyết định bỏ Python và chuyển sang Go. Thanks to Ren Sakamoto for translating Why we switched from Python to Go into Japanese, なぜ私達は Python から Go に移行したのか

Lý do 1 - Hiệu suất

Đi là nhanh. Đi cực kỳ nhanh. Hiệu suất tương tự như của Java hoặc C++. Đối với trường hợp sử dụng của chúng tôi, Go thường nhanh hơn 40 lần so với Python. Đây là một trò chơi điểm chuẩn nhỏ so sánh Go với Python

Lý do 2 - Các vấn đề về Hiệu suất Ngôn ngữ

Đối với nhiều ứng dụng, ngôn ngữ lập trình chỉ đơn giản là chất kết dính giữa ứng dụng và cơ sở dữ liệu. Bản thân hiệu suất của ngôn ngữ thường không quan trọng lắm. Tuy nhiên, Stream là nền tảng cung cấp nguồn cấp dữ liệu và trò chuyện cho 700 công ty và hơn 500 triệu người dùng cuối. Chúng tôi đã tối ưu hóa Cassandra, PostgreSQL, Redis, v.v. trong nhiều năm, nhưng cuối cùng, bạn đạt đến giới hạn của ngôn ngữ mà bạn đang sử dụng. Python là một ngôn ngữ tuyệt vời nhưng hiệu suất của nó khá chậm đối với các trường hợp sử dụng như tuần tự hóa/giải tuần tự hóa, xếp hạng và tổng hợp. Chúng tôi thường xuyên gặp sự cố về hiệu suất trong đó Cassandra sẽ mất 1 mili giây để truy xuất dữ liệu và Python sẽ dành 10 mili giây tiếp theo để biến nó thành các đối tượng

Lý do 3 - Năng suất của nhà phát triển & Không quá sáng tạo

Hãy xem đoạn mã Go nhỏ này từ hướng dẫn Cách tôi bắt đầu Go. [Đây là một hướng dẫn tuyệt vời và là điểm khởi đầu tốt để học một chút về cờ vây. ]

Nếu bạn là người mới sử dụng Go, sẽ không có nhiều điều làm bạn ngạc nhiên khi đọc đoạn mã nhỏ đó. Nó hiển thị nhiều bài tập, cấu trúc dữ liệu, con trỏ, định dạng và thư viện HTTP tích hợp. Khi mới bắt đầu lập trình, tôi luôn thích sử dụng các tính năng nâng cao hơn của Python. Python cho phép bạn thỏa sức sáng tạo với mã bạn đang viết. Ví dụ, bạn có thể

  • Sử dụng MetaClass để tự đăng ký các lớp khi khởi tạo mã
  • Hoán đổi Đúng và Sai
  • Thêm các chức năng vào danh sách các chức năng tích hợp
  • Quá tải toán tử thông qua các phương thức ma thuật
  • Sử dụng các hàm làm thuộc tính thông qua trình trang trí @property

Những tính năng này rất thú vị để sử dụng nhưng hầu hết các lập trình viên sẽ đồng ý rằng chúng thường làm cho mã khó hiểu hơn khi đọc tác phẩm của người khác. Đi buộc bạn phải bám vào những điều cơ bản. Điều này giúp dễ dàng đọc mã của bất kỳ ai và hiểu ngay điều gì đang xảy ra. Ghi chú. Tất nhiên, mức độ dễ dàng của nó thực sự phụ thuộc vào trường hợp sử dụng của bạn. Nếu bạn muốn tạo API CRUD cơ bản, tôi vẫn khuyên dùng Django + DRF hoặc Rails

Lý do 4 - Đồng thời & Kênh

Là một ngôn ngữ, Go cố gắng giữ mọi thứ đơn giản. Nó không giới thiệu nhiều khái niệm mới. Trọng tâm là tạo ra một ngôn ngữ đơn giản, cực kỳ nhanh và dễ làm việc với. Lĩnh vực duy nhất mà nó trở nên đổi mới là goroutines và các kênh. [Chính xác 100%, khái niệm CSP bắt đầu vào năm 1977, vì vậy sự đổi mới này là một cách tiếp cận mới hơn cho một ý tưởng cũ. ] Goroutine là cách tiếp cận gọn nhẹ của Go để phân luồng và các kênh là cách ưa thích để giao tiếp giữa các goroutine. Goroutines rất rẻ để tạo và chỉ chiếm vài KB bộ nhớ bổ sung. Bởi vì các Goroutine rất nhẹ nên có thể có hàng trăm hoặc thậm chí hàng ngàn chúng chạy cùng một lúc. Bạn có thể giao tiếp giữa các goroutine bằng các kênh. Thời gian chạy Go xử lý tất cả sự phức tạp. Cách tiếp cận đồng thời dựa trên kênh và goroutines giúp dễ dàng sử dụng tất cả các lõi CPU có sẵn và xử lý IO đồng thời - tất cả mà không làm phức tạp quá trình phát triển. So với Python/Java, việc chạy một hàm trên goroutine yêu cầu mã soạn sẵn tối thiểu. Bạn chỉ cần thêm vào trước lời gọi hàm với từ khóa “go”

https. //chuyến du lịch. golang. org/concurrency/1 Cách tiếp cận đồng thời của Go rất dễ làm việc với. Đó là một cách tiếp cận thú vị so với Node nơi nhà phát triển phải chú ý đến cách xử lý mã không đồng bộ. Một khía cạnh tuyệt vời khác của tính đồng thời trong cờ vây là trình phát hiện cuộc đua. Điều này giúp dễ dàng tìm ra liệu có bất kỳ điều kiện chủng tộc nào trong mã không đồng bộ của bạn hay không

Knock knock Điều kiện cuộc đua Ai ở đó?

- Tôi là Devloper [@iamdevloper] ngày 11 tháng 11 năm 2013

Dưới đây là một số tài nguyên hữu ích để bắt đầu với Go và các kênh

Dịch vụ vi mô lớn nhất của chúng tôi được viết bằng Go hiện mất 4 giây để biên dịch. Thời gian biên dịch nhanh của Go là một lợi thế lớn về năng suất so với các ngôn ngữ như Java và C++ vốn nổi tiếng với tốc độ biên dịch chậm chạp. Tôi thích đấu kiếm, nhưng còn tuyệt hơn khi hoàn thành công việc trong khi tôi vẫn nhớ mã phải làm gì

Lý do 6 - Khả năng xây dựng nhóm

Trước hết, hãy bắt đầu với điều hiển nhiên. không có nhiều nhà phát triển Go so với các ngôn ngữ cũ hơn như C++ và Java. Theo StackOverflow, 38% nhà phát triển biết Java, 19. 3% biết C++ và chỉ 4. 6% biết đi. Dữ liệu GitHub cho thấy một xu hướng tương tự. Go được sử dụng rộng rãi hơn các ngôn ngữ như Erlang, Scala và Elixir, nhưng ít phổ biến hơn Java và C++. May mắn thay, Go là một ngôn ngữ rất đơn giản và dễ học. Nó cung cấp các tính năng cơ bản bạn cần và không có gì khác. Các khái niệm mới mà nó giới thiệu là câu lệnh “defer” và quản lý đồng thời tích hợp với “go routines” và các kênh. [Dành cho những người theo chủ nghĩa thuần túy. Go không phải là ngôn ngữ đầu tiên triển khai các khái niệm này, chỉ là ngôn ngữ đầu tiên khiến chúng trở nên phổ biến. ] Bất kỳ nhà phát triển Python, Elixir, C++, Scala hoặc Java nào tham gia nhóm đều có thể sử dụng Go hiệu quả trong vòng một tháng vì tính đơn giản của nó. Chúng tôi nhận thấy việc xây dựng nhóm các nhà phát triển Go dễ dàng hơn so với nhiều ngôn ngữ khác. Nếu bạn đang thuê người trong các hệ sinh thái cạnh tranh như Boulder và Amsterdam thì đây là một lợi ích quan trọng

Lý do 7 - Hệ sinh thái mạnh mẽ

Đối với một nhóm có quy mô như chúng tôi [~20 người], hệ sinh thái rất quan trọng. Đơn giản là bạn không thể tạo ra giá trị cho khách hàng của mình nếu bạn phải phát minh lại mọi chức năng nhỏ. Go có hỗ trợ tuyệt vời cho các công cụ chúng tôi sử dụng. Các thư viện vững chắc đã có sẵn cho Redis, RabbitMQ, PostgreSQL, Phân tích cú pháp mẫu, Lập lịch tác vụ, Phân tích cú pháp biểu thức và RocksDB. Hệ sinh thái của Go là một chiến thắng lớn so với các ngôn ngữ mới hơn khác như Rust hoặc Elixir. Tất nhiên, nó không tốt bằng các ngôn ngữ như Java, Python hay Node, nhưng nó ổn định và đáp ứng nhiều nhu cầu cơ bản, bạn sẽ tìm thấy các gói chất lượng cao đã có sẵn

Lý do 8 - Gofmt, Định dạng mã được thực thi

Hãy bắt đầu với Gofmt là gì? . Gofmt là một tiện ích dòng lệnh tuyệt vời, được tích hợp trong trình biên dịch Go để định dạng mã của bạn. Về chức năng, nó rất giống với autopep8 của Python. Mặc dù chương trình ở Thung lũng Silicon miêu tả khác, nhưng hầu hết chúng ta không thực sự thích tranh luận về các tab và khoảng trắng. Điều quan trọng là định dạng nhất quán, nhưng tiêu chuẩn định dạng thực tế không thực sự quan trọng lắm. Gofmt tránh tất cả các cuộc thảo luận này bằng cách có một cách chính thức để định dạng mã của bạn

Lý do 9 - gRPC và bộ đệm giao thức

Go có hỗ trợ hạng nhất cho bộ đệm giao thức và gRPC. Hai công cụ này hoạt động rất tốt với nhau để xây dựng các dịch vụ siêu nhỏ cần giao tiếp qua RPC. Bạn chỉ cần viết một bảng kê khai trong đó bạn xác định các cuộc gọi RPC có thể được thực hiện và các đối số mà chúng thực hiện. Cả mã máy chủ và máy khách sau đó được tạo tự động từ bảng kê khai này. Mã kết quả này vừa nhanh, vừa có dung lượng mạng rất nhỏ và dễ sử dụng. Từ cùng một bảng kê khai, bạn thậm chí có thể tạo mã máy khách cho nhiều ngôn ngữ khác nhau, chẳng hạn như C++, Java, Python và Ruby. Vì vậy, không còn các điểm cuối REST mơ hồ cho lưu lượng truy cập nội bộ, mà bạn phải viết gần như cùng một mã máy khách và máy chủ cho mọi lần.

Nhược điểm 1 - Thiếu khung

Go không có một framework thống trị duy nhất như Rails cho Ruby, Django cho Python hay Laravel cho PHP. Đây là một chủ đề tranh luận sôi nổi trong cộng đồng Go, vì nhiều người ủng hộ rằng bạn không nên sử dụng một framework ngay từ đầu. Tôi hoàn toàn đồng ý rằng điều này đúng với một số trường hợp sử dụng. Tuy nhiên, nếu ai đó muốn xây dựng một API CRUD đơn giản, họ sẽ có thời gian dễ dàng hơn nhiều với Django/DJRF, Rails Laravel hoặc Phoenix. Cập nhật. như các nhận xét đã chỉ ra, có một số dự án cung cấp khung cho Go. Revel, Iris, Echo, Macaron và Buffalo dường như là những ứng cử viên hàng đầu. Đối với trường hợp sử dụng của Stream, chúng tôi không muốn sử dụng khung. Tuy nhiên, đối với nhiều dự án mới đang tìm cách cung cấp một API CRUD đơn giản, việc thiếu khung chi phối sẽ là một bất lợi nghiêm trọng

Nhược điểm 2 - Xử lý lỗi

Go xử lý lỗi bằng cách đơn giản là trả về một lỗi từ một hàm và mong đợi mã lệnh gọi của bạn xử lý lỗi đó [hoặc đưa nó trở lại ngăn xếp lệnh gọi]. Mặc dù cách tiếp cận này hiệu quả nhưng rất dễ bỏ sót phạm vi của lỗi sai để đảm bảo bạn có thể cung cấp lỗi có ý nghĩa cho người dùng của mình. Gói lỗi giải quyết vấn đề này bằng cách cho phép bạn thêm ngữ cảnh và dấu vết ngăn xếp vào lỗi của bạn. Một vấn đề khác là rất dễ vô tình quên xử lý lỗi. Các công cụ phân tích tĩnh như errcheck và megacheck rất tiện dụng để tránh mắc phải những sai lầm này. Mặc dù những cách giải quyết này hoạt động tốt nhưng nó không hoàn toàn đúng. Bạn muốn xử lý lỗi thích hợp được hỗ trợ bởi ngôn ngữ

Nhược điểm 3 - Quản lý gói

Cập nhật. Quản lý gói của Go đã đi một chặng đường dài kể từ khi bài đăng này được viết. Các mô-đun Go là một giải pháp hiệu quả, vấn đề duy nhất tôi thấy với chúng là chúng phá vỡ một số công cụ phân tích tĩnh như errcheck. Đây là hướng dẫn để học cách sử dụng Go bằng cách sử dụng các mô-đun Go. Quản lý gói của Go không có nghĩa là hoàn hảo. Theo mặc định, nó không có cách chỉ định một phiên bản phụ thuộc cụ thể và không có cách nào để tạo các bản dựng có thể lặp lại. Python, Node và Ruby đều có hệ thống quản lý gói tốt hơn. Tuy nhiên, với các công cụ phù hợp, việc quản lý gói của Go hoạt động khá tốt. Bạn có thể sử dụng Dep để quản lý các phụ thuộc của mình để cho phép chỉ định và ghim các phiên bản. Ngoài ra, chúng tôi đã đóng góp một công cụ mã nguồn mở có tên VirtualGo giúp làm việc trên nhiều dự án được viết bằng Go dễ dàng hơn

Python đấu với cờ vây

Cập nhật. Sự khác biệt về hiệu suất giữa Python và Go tăng lên kể từ khi bài đăng này được viết. [Go trở nên nhanh hơn còn Python thì không] Một thử nghiệm thú vị mà chúng tôi đã thực hiện là lấy chức năng của chúng tôi trong Python và viết lại nó trong Go. Hãy xem ví dụ này về phương pháp xếp hạng

Cả mã Python và mã Go đều cần thực hiện các thao tác sau để hỗ trợ phương thức xếp hạng này

  1. Phân tích cú pháp biểu thức cho điểm số. Trong trường hợp này, chúng ta muốn biến chuỗi “simple_gauss[time]*popularity” này thành một hàm lấy một hoạt động làm đầu vào và trả về điểm số làm đầu ra
  2. Tạo các chức năng một phần dựa trên cấu hình JSON. Ví dụ: chúng tôi muốn “simple_gauss” gọi “decay_gauss” với thang đo là 5 ngày, độ lệch là 1 ngày và hệ số phân rã là 0. 3
  3. Phân tích cú pháp cấu hình “mặc định” để bạn có dự phòng nếu một trường nhất định không được xác định trên một hoạt động
  4. Sử dụng chức năng từ bước 1 để chấm điểm tất cả các hoạt động trong nguồn cấp dữ liệu

Phát triển phiên bản Python của mã xếp hạng mất khoảng 3 ngày. Điều đó bao gồm viết mã, kiểm tra đơn vị và tài liệu. Tiếp theo, chúng tôi đã dành khoảng 2 tuần để tối ưu hóa mã. Một trong những cách tối ưu hóa là dịch biểu thức điểm số [simple_gauss[time]*phổ biến] thành một cây cú pháp trừu tượng. Chúng tôi cũng đã triển khai logic lưu vào bộ nhớ đệm để tính toán trước điểm số cho những thời điểm nhất định trong tương lai. Ngược lại, việc phát triển phiên bản Go của mã này mất khoảng 4 ngày. Hiệu suất không yêu cầu bất kỳ tối ưu hóa nào nữa. Vì vậy, mặc dù phần phát triển ban đầu nhanh hơn trong Python, phiên bản dựa trên Go cuối cùng yêu cầu nhóm của chúng tôi ít công việc hơn đáng kể. Là một lợi ích bổ sung, mã Go hoạt động nhanh hơn khoảng 40 lần so với mã Python được tối ưu hóa cao của chúng tôi. Bây giờ, đây chỉ là một ví dụ đơn lẻ về mức tăng hiệu suất mà chúng tôi đã trải nghiệm bằng cách chuyển sang Go. Tất nhiên, đó là so sánh táo với cam

  • Mã xếp hạng là dự án đầu tiên của tôi trong Go
  • Mã Go được xây dựng sau mã Python, vì vậy trường hợp sử dụng được hiểu rõ hơn
  • Thư viện Go để phân tích cú pháp biểu thức có chất lượng vượt trội

Số dặm của bạn sẽ thay đổi. Một số thành phần khác trong hệ thống của chúng tôi mất nhiều thời gian hơn để xây dựng trong Go so với Python. Theo xu hướng chung, chúng tôi thấy rằng việc phát triển mã Go cần nhiều nỗ lực hơn một chút. Tuy nhiên, chúng tôi dành ít thời gian hơn để tối ưu hóa mã cho hiệu suất

Elixir vs Go - Á quân

Một ngôn ngữ khác mà chúng tôi đã đánh giá là Elixir. Elixir được xây dựng trên máy ảo Erlang. Đó là một ngôn ngữ hấp dẫn và chúng tôi đã xem xét nó vì một trong những thành viên trong nhóm của chúng tôi có rất nhiều kinh nghiệm với Erlang. Đối với các trường hợp sử dụng của chúng tôi, chúng tôi nhận thấy rằng hiệu suất thô của Go tốt hơn nhiều. Cả Go và Elixir sẽ làm tốt công việc phục vụ hàng nghìn yêu cầu đồng thời. Tuy nhiên, nếu bạn nhìn vào hiệu suất yêu cầu riêng lẻ, Go sẽ nhanh hơn đáng kể cho trường hợp sử dụng của chúng tôi. Một lý do khác khiến chúng tôi chọn Go over Elixir là hệ sinh thái. Đối với các thành phần chúng tôi yêu cầu, Go có nhiều thư viện trưởng thành hơn trong khi trong nhiều trường hợp, các thư viện Elixir chưa sẵn sàng để sử dụng sản xuất. Việc đào tạo/tìm nhà phát triển làm việc với Elixir cũng khó hơn. Những lý do này đã nghiêng cán cân nghiêng về Go. Mặc dù vậy, khung Phoenix cho Elixir trông rất tuyệt và chắc chắn đáng xem

Phần kết luận

Go là một ngôn ngữ rất hiệu quả với sự hỗ trợ tuyệt vời cho đồng thời. Nó gần như nhanh như các ngôn ngữ như C++ và Java. Mặc dù mất nhiều thời gian hơn để xây dựng mọi thứ bằng Go so với Python hoặc Ruby, nhưng bạn sẽ tiết kiệm được rất nhiều thời gian dành cho việc tối ưu hóa mã. Chúng tôi có một nhóm phát triển nhỏ tại Nguồn cung cấp năng lượng phát trực tuyến và trò chuyện cho hơn 500 triệu người dùng cuối. Sự kết hợp của Go với một hệ sinh thái tuyệt vời, dễ dàng giới thiệu cho các nhà phát triển mới, hiệu suất nhanh, hỗ trợ đồng thời chắc chắn và môi trường lập trình hiệu quả khiến nó trở thành một lựa chọn tuyệt vời. Luồng vẫn tận dụng Python cho bảng điều khiển, trang web và máy học của chúng tôi cho các nguồn cấp dữ liệu được cá nhân hóa. Chúng tôi sẽ không sớm nói lời tạm biệt với Python, nhưng trong tương lai, tất cả các mã chuyên sâu về hiệu suất sẽ được viết bằng Go. Cái mới của chúng tôi cũng được viết hoàn toàn bằng Go. Nếu bạn muốn tìm hiểu thêm về Go, hãy xem các bài đăng trên blog được liệt kê bên dưới. Để tìm hiểu thêm về Stream, hướng dẫn tương tác này là một điểm khởi đầu tuyệt vời

Ngôn ngữ lập trình nào nhanh nhất?

Có thể có trường hợp một ngôn ngữ có thể nhanh hơn ngôn ngữ kia nhưng đối với phần lớn các trường hợp, danh sách dưới đây có thể chấp nhận được. .
C#.
Java. .
Ađa. .
Julia. .
Fortran. .
rỉ sét. .
C++ C++ là một trong những ngôn ngữ hiệu quả nhất và nhanh nhất. .
C. Điều đặc biệt về C là, không có gì đặc biệt

Ngôn ngữ nào mạnh hơn Python?

JavaScript tốt hơn cho việc phát triển trang web .

Python hay C++ cái nào nhanh hơn?

C++ nhanh hơn Python vì nó được nhập tĩnh, dẫn đến việc biên dịch mã nhanh hơn. Python chậm hơn C++, nó hỗ trợ gõ động và nó cũng sử dụng trình thông dịch, khiến quá trình biên dịch chậm hơn.

Cái nào nhanh hơn Java hay Python?

Java và Python là hai ngôn ngữ lập trình phổ biến nhất. Trong hai ngôn ngữ này, Java là ngôn ngữ nhanh hơn , nhưng Python thì đơn giản và dễ học hơn. Mỗi cái đều được thiết lập tốt, độc lập với nền tảng và là một phần của cộng đồng lớn, hỗ trợ.

Chủ Đề