Julia đấu với Python 2022

Ngôn ngữ lập trình thực tế là xương sống của khoa học dữ liệu và trong các công nghệ hiện đại, chúng tôi có rất nhiều ngôn ngữ có sẵn với chi phí của chúng tôi. Nhưng câu hỏi đặt ra là cái nào trong số chúng là phù hợp nhất cho một nhà khoa học dữ liệu. Tìm kiếm một số ngôn ngữ lập trình tốt nhất cho các nhà thống kê? . Python là một ngôn ngữ lập trình đa mô hình khác được sử dụng cho máy học, mặc dù nhìn chung Python được coi là hướng đối tượng. Mặt khác, Julia dựa nhiều hơn vào mô hình chức năng. Julia là một tiếng vang mới trong lĩnh vực CNTT, được công nhận chủ yếu nhờ tốc độ và đang thu hút sự chú ý của các Nhà khoa học dữ liệu và Nhà thống kê. Bây giờ cho câu hỏi, Python vs Julia. các nhà thống kê nên học ngôn ngữ lập trình nào vào năm 2023?

Python đấu với Julia. Ưu điểm của Python

Được phát hành vào năm 1991, Python là ngôn ngữ lập trình được sử dụng để phát triển web, phát triển phần mềm, toán học và viết kịch bản có hệ thống. Trong Python, phần tử đầu tiên của một mảng được truy cập bằng số 0, chẳng hạn như chuỗi [0] trong Python cho ký tự đầu tiên trong chuỗi. Nó giúp theo cách tiếp nhận của đối tượng sử dụng phổ thông hơn với thói quen lập trình ăn sâu

Python phổ biến đối với các nhà phát triển vì sức mạnh, khả năng thích ứng và cú pháp dễ hiểu, dễ hiểu và thành thạo. Gần 70% nhà phát triển cho biết họ sử dụng Python để xây dựng các thuật toán AI và ML hiệu suất cao để Xử lý ngôn ngữ tự nhiên và phân tích tình cảm. Python, cùng với R, là ngôn ngữ được lựa chọn cho Khoa học dữ liệu. Bề rộng và tính hữu ích của văn hóa gói bên thứ ba của Python vẫn là một trong những điểm thu hút lớn nhất của ngôn ngữ này

Ngoài việc đạt được các cải tiến đối với trình thông dịch Python (bao gồm các cải tiến đối với xử lý song song và đa lõi), Python đã trở nên dễ dàng tăng tốc hơn. Dự án mypyc dịch Python được chú thích kiểu thành ngôn ngữ C gốc, ít rườm rà hơn nhiều so với Cython. Nó thường mang lại hiệu suất cải thiện gấp bốn lần và thường là nhiều hơn nữa đối với các hoạt động toán học thuần túy

Python đấu với Julia. Ưu điểm của Julia

Lần đầu tiên xuất hiện vào năm 2012, Julia là một ngôn ngữ lập trình động cấp cao, hiệu năng cao. Mặc dù nó là ngôn ngữ có mục đích chung và có thể được sử dụng để viết bất kỳ ứng dụng nào, nhưng nhiều tính năng của nó rất phù hợp cho phân tích số và khoa học tính toán. Các khai báo kiểu và biên dịch JIT của Julia có nghĩa là nó có thể thường xuyên đánh bại Python “thuần túy”, chưa được tối ưu hóa theo các cấp độ lớn. Python có thể được thực hiện nhanh hơn nhờ các thư viện bên ngoài, trình biên dịch JIT của bên thứ ba (PyPy) và tối ưu hóa bằng các công cụ như Cython, nhưng Julia được thiết kế để nhanh hơn ngay lập tức

Đối tượng mục tiêu chính của Julia là người dùng các môi trường và ngôn ngữ điện toán khoa học như Matlab, R, Mathematica và Octave. Cú pháp của Julia cho các phép toán trông giống như cách các công thức toán học được viết bên ngoài thế giới máy tính, giúp những người không phải là lập trình viên dễ dàng tiếp thu hơn. Flux là một thư viện máy học dành cho Julia có nhiều mẫu mô hình hiện có cho các trường hợp sử dụng phổ biến. Vì nó được viết hoàn toàn bằng Julia nên người dùng có thể sửa đổi nó khi cần và nó sử dụng trình biên dịch tức thời gốc của Julia để tối ưu hóa các dự án từ trong ra ngoài

Julia là ngôn ngữ lập trình năng động, cấp cao, hiệu suất cao được thiết kế chủ yếu cho máy tính kỹ thuật có cú pháp tương tự như Python. Vì đại số tuyến tính là một thành phần thiết yếu của ngôn ngữ này nên nó thường được sử dụng trong Học máy, Khoa học dữ liệu, khai thác dữ liệu, phân tích số và bất kỳ mục đích toán học nào

Tính đơn giản, hiệu suất tuyệt vời và tốc độ của Julia là những tính năng bán chạy của nó để xử lý các mô hình dữ liệu phức tạp. Tuy nhiên, tiềm năng chuyển đổi ngôn ngữ công thức của Khoa học thành mã là một công cụ phá vỡ thỏa thuận đối với các nhà khoa học. Julia hỗ trợ việc sử dụng các chữ cái Hy Lạp, cho phép sử dụng trực tiếp các công thức toán học trong mã thay vì dịch các công thức đó sang ngôn ngữ mã hóa


từ chối trách nhiệm. Thông tin được cung cấp trong bài viết này chỉ là quan điểm của tác giả và không phải là lời khuyên đầu tư – nó chỉ được cung cấp cho mục đích giáo dục. Bằng cách sử dụng điều này, bạn đồng ý rằng thông tin không cấu thành bất kỳ hướng dẫn đầu tư hoặc tài chính nào. Tiến hành nghiên cứu của riêng bạn và liên hệ với các cố vấn tài chính trước khi đưa ra bất kỳ quyết định đầu tư nào

Ưu điểm chính của Julia so với Python chắc chắn là tốc độ và các khái niệm như gửi nhiều lần. Nhưng có nhiều hơn. Trong sử dụng hàng ngày, tính nhất quán đóng một vai trò quan trọng

Mức độ dễ (hoặc khó) của việc học và sử dụng một ngôn ngữ lập trình phụ thuộc rất nhiều vào việc các cấu trúc khác nhau của ngôn ngữ đó có thể được sử dụng và áp dụng nhất quán như thế nào. Mức độ nhất quán cao cũng giúp tránh sai sót, do đó, nó trở thành một khía cạnh quan trọng để xây dựng phần mềm chất lượng. Trong bài viết này, tôi sẽ cho thấy Julia và Python hoạt động tốt như thế nào trong lĩnh vực này

Sử dụng phạm vi và lập chỉ mục làm ví dụ, trước tiên tôi sẽ minh họa sự khác biệt của hai ngôn ngữ trong cách sử dụng các khái niệm này và sau đó giải thích lý do đằng sau nó

Các dãy

Trong lập trình, một dãy số, được chỉ định bởi giới hạn dưới và giới hạn trên, là một khái niệm thường được sử dụng. Hãy xem cách nó được áp dụng trong cả hai ngôn ngữ

Một dãy số nguyên

Nếu chúng ta cần, giả sử một dãy số nguyên từ 4 đến 10, điều này được thể hiện như sau

Python: range(4,11)                    Julia: 4:10

Trong Julia, giới hạn dưới và giới hạn trên được bao gồm khi chỉ định một phạm vi, trong khi ở Python, giới hạn dưới được bao gồm và giới hạn trên loại trừ. Vì vậy, chúng tôi phải đưa ra giới hạn trên là 11, nếu chúng tôi muốn các số lên tới 10 trong Python

Một loạt các phần tử từ một mảng

Nếu chúng ta có một mảng

Python: a[3:10]                       Julia: a[4:10]
4 và muốn trích xuất phần tử thứ 4 cho đến phần tử thứ 10, chúng ta phải viết

Python: a[3:10]                       Julia: a[4:10]

Trong Python, việc lập chỉ mục cho các mảng (danh sách) bắt đầu từ 0, vì vậy phần tử thứ 4 có chỉ mục là 3. Và một lần nữa giới hạn trên là độc quyền. Vì vậy, để xác định rằng chúng tôi muốn các phần tử lên đến phần tử thứ 10 (có chỉ số 9), chúng tôi phải đặt ở đó 10

Như chúng ta có thể thấy ở đây, ở Julia, biểu thức chính xác giống như trên được sử dụng. Và nó không chỉ là cùng một biểu thức, mà còn là cùng một đối tượng (phạm vi). Nó có thể được sử dụng 'độc lập' như trên hoặc được đưa ra làm đối số cho một mảng để lập chỉ mục

Một phạm vi để rút số ngẫu nhiên từ

Các biểu thức sau đây được sử dụng để tạo các số ngẫu nhiên trong phạm vi từ 4 đến 10

Python: randint(4,10)                Julia: rand(4:10)

Trong Python, giới hạn trên bao gồm trong trường hợp này, do đó đi chệch khỏi khái niệm chung. Trong Julia, chúng tôi chuyển chính xác đối tượng phạm vi, được giới thiệu ở trên, làm đối số cho hàm

Python: a[3:10]                       Julia: a[4:10]
5

Giới thiệu kích thước bước

Nếu chúng tôi không muốn từng phần tử trong một phạm vi, nhưng e. g. chỉ mỗi phần tử thứ hai, điều này có thể được chỉ định trong cả hai ngôn ngữ bằng cách sử dụng kích thước bước (trong ví dụ này là kích thước 2 thay vì 1). Vì vậy, để có được mỗi số thứ hai từ 4 đến 10, chúng tôi viết

Python: range(4,11,2)               Julia: 4:2:10

Trong Julia, phiên bản mở rộng này cũng chỉ là một đối tượng phạm vi. Vì vậy, nó có thể được sử dụng ở mỗi nơi có thể chỉ định một đối tượng phạm vi, đặc biệt là trong các trường hợp trên để chỉ định một dải con của một mảng hoặc để chỉ định phạm vi từ nơi các số ngẫu nhiên được rút ra

                                    Julia: a[4:2:10]
rand(4:2:10)

Điều này là không thể trong Python

Các loại phạm vi khác

Tất nhiên không chỉ có dãy số nguyên. Ví dụ tiếp theo hiển thị phạm vi dấu thời gian ba giờ vào ngày 8 tháng 4 năm 2022 (từ 12. 00 đến 14. 00)

Python: pandas.data_range(start='08/04/2022 12:00', 
periods=3, freq='H')
Julia: DateTime(2022,4,8,12):Hour(1):DateTime(2022,4,8,14)

Có thể thấy, ở Julia, cú pháp cơ bản giống nhau (

Python: a[3:10]                       Julia: a[4:10]
6) được sử dụng như trong trường hợp dãy số nguyên

Trong Julia, điều này cũng có thể được áp dụng cho các loại dữ liệu khác, như ký tự. Ở đây chúng tôi chỉ định một loạt các ký tự từ 'd' đến 'k'

                                  Julia: 'd':'k'

Điều này là không thể trong Python

lập chỉ mục

Ví dụ thứ hai được sử dụng trong bài viết này để chứng minh mức độ nhất quán (hoặc không nhất quán) của một khái niệm được áp dụng, đó là lập chỉ mục cho các cấu trúc dữ liệu dạng mảng 2 chiều

Truy cập một phần tử trong một ma trận

Để truy cập phần tử ở hàng thứ 2 và cột thứ 4 của ma trận

Python: a[3:10]                       Julia: a[4:10]
7 (mảng 2 chiều) ta viết

Python: a[3:10]                       Julia: a[4:10]
1

Trong Python, một danh sách các danh sách được sử dụng (vì không có mảng n chiều trong thư viện cơ sở). Do đó, việc lập chỉ mục cho một cấu trúc như vậy là một quy trình gồm hai bước (và cần gấp đôi dấu ngoặc). Và một lần nữa, khi lập chỉ mục bắt đầu từ 0 trong Python, hàng thứ 2 có chỉ mục 1 và cột thứ 4 có chỉ mục 3

Truy cập một phần tử trong DataFrame

Để lấy phần tử ở hàng thứ 2 và cột thứ 4 của DataFrame

Python: a[3:10]                       Julia: a[4:10]
8 (là cấu trúc dữ liệu 2 chiều tương tự như bảng cơ sở dữ liệu), chúng ta phải viết

Python: a[3:10]                       Julia: a[4:10]
3

Ở Julia, đây chính xác là ký hiệu như trên

Trái ngược với danh sách các danh sách được sử dụng để biểu diễn ma trận trong Python, DataFrame là cấu trúc 2 chiều thực sự. Do đó các chỉ số có thể được viết trong một cặp dấu ngoặc

Truy cập một loạt các phần tử trong DataFrame

Mỗi cột trong DataFrame có một tên. Những tên này cũng có thể được sử dụng để tham chiếu một cột. Vì vậy, nếu chúng ta muốn các phần tử từ hàng 4 đến 10 trong các cột có tên là “A” và “B”, chúng ta viết

Python: a[3:10]                       Julia: a[4:10]
4

Gán giá trị cho phần tử ma trận

Để gán giá trị 5 cho phần tử ma trận ở hàng thứ 2 và cột thứ 4 của ma trận

Python: a[3:10]                       Julia: a[4:10]
7, ta phải viết

Python: a[3:10]                       Julia: a[4:10]
0

Gán một giá trị cho một phần tử trong DataFrame

Nếu chúng ta muốn gán giá trị 5 cho phần tử ở hàng thứ 2 và cột thứ 4 của DataFrame

Python: a[3:10]                       Julia: a[4:10]
8, các biểu thức sau được sử dụng

Python: a[3:10]                       Julia: a[4:10]
1

Để gán giá trị đó cho phần tử ở hàng thứ 2 cột “A” ta viết

Python: a[3:10]                       Julia: a[4:10]
2

Tóm lược

Để lập chỉ mục một ma trận trong Python (là danh sách các danh sách), một ký hiệu bao gồm hai cặp dấu ngoặc được sử dụng, trong khi đối với DataFrames, phải sử dụng một cặp dấu ngoặc kết hợp với lệnh gọi phương thức. Có một phương pháp khác nhau cho từng loại lập chỉ mục (______31)

Ở Julia có một ký hiệu chung cho tất cả các trường hợp này. Hai chỉ số luôn được đặt giữa một cặp dấu ngoặc. Đó là nó

Nhưng tại sao?

Tôi nghĩ rõ ràng là mức độ nhất quán cao hơn trong Julia làm cho ngôn ngữ dễ học hơn, dễ đọc hơn và dễ sử dụng hơn. Vì vậy, câu hỏi đặt ra. Nếu lợi thế quá rõ ràng, tại sao họ không làm điều đó bằng Python (hoặc một số ngôn ngữ lập trình khác có mức độ nhất quán thấp hơn)?

Câu trả lời ngắn gọn là. Bởi vì họ không thể

Câu trả lời dài hơn

Bây giờ đến câu trả lời dài hơn. Nếu chúng ta nhìn vào hậu trường, thì e. g. truy cập một phần tử trong một ma trận ở Julia (như

Python: randint(4,10)                Julia: rand(4:10)
2 ) chuyển thành lệnh gọi hàm
Python: randint(4,10)                Julia: rand(4:10)
3 như sau

Python: a[3:10]                       Julia: a[4:10]
3

Ký hiệu với dấu ngoặc đơn chỉ là đường cú pháp (được kích hoạt bằng cách nạp chồng toán tử) cho lệnh gọi hàm này. Điều này đúng cho tất cả các ví dụ

Truy cập một giá trị bằng cách sử dụng `getindex` [hình ảnh của tác giả]

Mỗi lệnh gọi hàm này được thực hiện với các đối số thuộc các loại khác nhau

Các loại đối số khác nhau cho `getindex` [hình ảnh của tác giả]

Tùy thuộc vào kiểu dữ liệu được sử dụng cho các đối số, cách triển khai thích hợp của

Python: randint(4,10)                Julia: rand(4:10)
3 được gọi. Và bạn đoán nó có lẽ đã. Đây là khái niệm nổi tiếng về nhiều công văn tại nơi làm việc

Vì vậy, nhiều công văn cuối cùng tạo điều kiện cho việc sử dụng nhất quán một chức năng (

Python: randint(4,10)                Julia: rand(4:10)
3) có thể được áp dụng trong nhiều biến thể tương tự. Ngoài ra, nó được bọc trong lớp áo đẹp (ký hiệu sử dụng dấu ngoặc); . Cốt lõi dựa trên nhiều công văn. Do đó, các ngôn ngữ lập trình không có khái niệm này, không thể cung cấp mức độ nhất quán này

Hiện tại, chỉ riêng thư viện cơ sở của Julia đã có 220 biến thể của

Python: randint(4,10)                Julia: rand(4:10)
3. Vì vậy, nó thực sự cho phép áp dụng rộng rãi khái niệm này

Gán một giá trị

Các ví dụ trong đó một giá trị được gán cho một phần tử của cấu trúc dạng ma trận hoạt động theo cách tương tự. Thay vì

Python: randint(4,10)                Julia: rand(4:10)
3 họ sử dụng
Python: randint(4,10)                Julia: rand(4:10)
8. Vì vậy, cơ chế là như nhau ở đây

Chỉ định một giá trị bằng cách sử dụng `setindex` [hình ảnh của tác giả]

Đằng sau hậu trường của phạm vi

Bây giờ đến các ví dụ, nơi phạm vi đã được sử dụng. Tất cả các biểu thức ở trên, chỉ định một phạm vi, đại diện cho các đối tượng thuộc loại

Python: randint(4,10)                Julia: rand(4:10)
9 (có kích thước bước mặc định là 1) hoặc
Python: range(4,11,2)               Julia: 4:2:10
0 (sử dụng các kích thước bước khác). Cả hai loại đều là kiểu con của kiểu trừu tượng
Python: range(4,11,2)               Julia: 4:2:10
1 như hệ thống phân cấp kiểu sau cho thấy

Nhập phân cấp cho phạm vi [hình ảnh của tác giả]

Ví dụ

  • Python: range(4,11,2)               Julia: 4:2:10
    2 là một đối tượng thuộc loại
    Python: range(4,11,2)               Julia: 4:2:10
    3 (_______54 trong dấu ngoặc nhọn cho chúng ta biết rằng cận dưới và cận trên của phạm vi thuộc loại số nguyên này),
  • Python: range(4,11,2)               Julia: 4:2:10
    5 một đối tượng kiểu
    Python: range(4,11,2)               Julia: 4:2:10
    6 (ở đây các giới hạn cũng như các bước thuộc kiểu
    Python: range(4,11,2)               Julia: 4:2:10
    4) và
  • Python: range(4,11,2)               Julia: 4:2:10
    8
    thuộc loại
    Python: range(4,11,2)               Julia: 4:2:10
    9.

Và sau đó một lần nữa nhiều công văn đến với trò chơi

  • Truy cập một loạt các phần tử của một mảng với
                                        Julia: a[4:2:10]
    rand(4:2:10)
    0, như chúng ta đã học ở trên, thành
                                        Julia: a[4:2:10]
    rand(4:2:10)
    1. Vì vậy, có một triển khai của
    Python: randint(4,10)                Julia: rand(4:10)
    3 chấp nhận một kiểu con của
    Python: range(4,11,2)               Julia: 4:2:10
    1 làm đối số chỉ mục (ngoài cách lập chỉ mục “cổ điển” bằng cách sử dụng một số nguyên và khá nhiều biến thể khác)
  • Vẽ một số ngẫu nhiên từ một dãy số bằng cách sử dụng
                                        Julia: a[4:2:10]
    rand(4:2:10)
    4 có nghĩa là có một triển khai của
    Python: a[3:10]                       Julia: a[4:10]
    5 (trong số các phiên bản khác), chấp nhận một kiểu con của
    Python: range(4,11,2)               Julia: 4:2:10
    1 làm đối số của nó

Vì vậy, cuối cùng, nó cũng tập trung vào ứng dụng của nhiều công văn (vốn dựa trên hệ thống kiểu Julia, có thể được mở rộng tùy ý bởi các kiểu do người dùng xác định)

Và nhiều đường cú pháp hơn

Đối với những người quan tâm. Ký hiệu cho các phạm vi sử dụng dấu hai chấm như

Python: range(4,11,2)               Julia: 4:2:10
2 hoặc
Python: range(4,11,2)               Julia: 4:2:10
5 cũng chỉ là một phiên bản đẹp hơn về mặt cú pháp của lệnh gọi hàm thông thường (một lần nữa dựa trên nạp chồng toán tử). Trong trường hợp này, đó là hàm
                                    Julia: a[4:2:10]
rand(4:2:10)
9

Vì vậy,

Python: range(4,11,2)               Julia: 4:2:10
2 thực sự là
Python: pandas.data_range(start='08/04/2022 12:00', 
periods=3, freq='H')
Julia: DateTime(2022,4,8,12):Hour(1):DateTime(2022,4,8,14)
1 và
Python: range(4,11,2)               Julia: 4:2:10
5 tương đương với
Python: pandas.data_range(start='08/04/2022 12:00', 
periods=3, freq='H')
Julia: DateTime(2022,4,8,12):Hour(1):DateTime(2022,4,8,14)
3 (kích thước bước là đối số từ khóa tùy chọn; đó là lý do tại sao từ khóa
Python: pandas.data_range(start='08/04/2022 12:00', 
periods=3, freq='H')
Julia: DateTime(2022,4,8,12):Hour(1):DateTime(2022,4,8,14)
4 là cần thiết trong ví dụ này)

Phần kết luận

Sử dụng các ví dụ như lập chỉ mục và phạm vi, chúng ta có thể thấy rằng mọi thứ có thể được diễn đạt theo những cách rất nhất quán trong Julia, điều này làm cho ngôn ngữ trở nên dễ học, dễ đọc và cuối cùng cũng dễ sử dụng

Tính nhất quán này đã đạt được với một vài khái niệm mạnh mẽ như gửi nhiều lần, hệ thống loại có thể mở rộng và quá tải toán tử, đã được chế tạo cẩn thận để hoạt động liền mạch với nhau

Julia có đáng để học 2022 không?

Những lý do chính để học Julia. Julia cho phép bạn gọi trực tiếp các thư viện Python, C và Fortran . Bạn có thể tận hưởng hiệu suất tương tự như C với ít dòng mã hơn. Julia có thể xử lý các nhiệm vụ phân tích dữ liệu phức tạp một cách dễ dàng. Nó có các gói học máy và học sâu cho các mô hình lớn hơn và phức tạp hơn.

Julia sẽ thay thế Python?

Khi càng có nhiều người sử dụng Julia, có khả năng nó sẽ trở nên phổ biến hơn và thay thế Python làm ngôn ngữ được lựa chọn cho nhiều tác vụ . Tuy nhiên, điều quan trọng cần nhớ là cả hai ngôn ngữ đều có điểm mạnh và điểm yếu riêng và có thể được sử dụng cùng nhau trong một số trường hợp.

Python có còn đáng học vào năm 2022 không?

Vâng, học Python rất đáng để học vào năm 2022 vì một số lĩnh vực hot nhất trong công nghệ – bao gồm học máy và trí tuệ nhân tạo – phụ thuộc rất nhiều vào các lập trình viên có kỹ năng Python.

Tôi nên sử dụng Julia hay Python?

Dưới đây là một số điểm khác biệt giữa Julia và Python. Julia là ngôn ngữ lập trình được biên dịch, trong khi python là ngôn ngữ được thông dịch . Ngôn ngữ Julia nhanh hơn ngôn ngữ lập trình python. Nhưng mặt khác, python thân thiện với người dùng hơn ngôn ngữ Julia.