Trong hướng dẫn R này, chúng ta sẽ thảo luận về việc điều chỉnh Performance trong R. Chúng ta sẽ khám phá các yếu tố khác nhau làm giảm Performance của lập trình R và cũng bao gồm các mẹo để nâng cao Performance của nó.
Các bài viết liên quan:
Kỹ thuật điều chỉnh Performance R
Viết mã R một cách nhanh chóng
Trong phần điều chỉnh Performance R này, chúng ta sẽ thảo luận về các yếu tố khác nhau làm chậm mã R và cách chúng ta có thể viết mã trong R một cách nhanh chóng.
R có chậm không?
- Mặc dù một số chương trình R có thể chậm, do đó, để tăng tốc độ thực thi, các chương trình phải được tối ưu hóa đủ tốt.
- Trong R, tốc độ chưa bao giờ là trọng tâm trong quá trình phát triển của nó.
- Nó được thiết kế chủ yếu để làm cho việc lập trình dễ dàng hơn nhiều.
- Trong R, có một cơ sở độc quyền để gọi một số hàm C cũng như C ++.
Viết mã R chạy nhanh hơn
R là phần mềm thống kê phổ biến đang thịnh hành do số lượng lớn các gói. Cú pháp của R rất linh hoạt, thuận tiện với chi phí thực hiện. R thực sự chậm khi so sánh với nhiều ngôn ngữ kịch bản khác, nhưng có một số thủ thuật có thể làm cho mã R của chúng ta chạy nhanh hơn:
- Sử dụng ma trận thay vì khung dữ liệu bất cứ khi nào có thể vì khung dữ liệu gây ra vấn đề trong nhiều trường hợp. Do đó, chỉ sử dụng khung dữ liệu bất cứ khi nào cần thiết.
- Sử dụng double (n) để tạo một vectơ có độ dài n thay vì sử dụng mã đại diện (0, n) và tương tự cho các vectơ khác.
- Chia đối tượng dữ liệu lớn (ví dụ: khung hoặc ma trận dữ liệu lớn) thành những đối tượng nhỏ hơn và vận hành nó trên các đối tượng nhỏ hơn này.
- Sử dụng phép toán vectơ và ma trận, nếu có thể.
- Tránh thay đổi kiểu và kích thước của một đối tượng trong R. Trong R, việc thay đổi kiểu và kích thước của một đối tượng R buộc nó phải phân bổ lại không gian bộ nhớ mà tất nhiên là không đủ.
- Tránh tạo ra quá nhiều đối tượng trong mỗi môi trường làm việc. Bộ nhớ không đủ có thể làm chậm mã của bạn cũng như không thể thực thi các chương trình khi được cấp phát bằng các vectơ phức tạp. Một cách để làm điều này là viết các hàm nhỏ và chạy chúng thay vì chạy mọi thứ trực tiếp trong môi trường làm việc.
Nhiều Loop
Trong R, nhiều câu hỏi đặt ra để hoàn thành các nhiệm vụ khác nhau mà không có vòng lặp for . Các lập trình viên thường nên tránh những vòng lặp này bằng mọi giá.
Vectorization để tăng tốc độ
Đôi khi, chúng ta có thể sử dụng vectơ hóa thay vì lặp lại. Ví dụ: nếu x và y là các vectơ có độ dài bằng nhau, bạn có thể viết như sau:
z < – x + y
Điều này không chỉ nhỏ gọn hơn, mà còn quan trọng hơn. Nếu chúng ta hiểu đúng về các đai ốc và bu lông của vectơ hóa trong R, chúng ta có thể thực hiện vòng lặp for nhanh hơn nhiều. Điều này là do, với sự trợ giúp của vectơ hóa, chúng ta có thể viết mã ngắn hơn, đơn giản hơn và nhanh hơn nhiều ngay từ đầu.
Các vấn đề về lập trình và bộ nhớ chức năng
Lập trình chức năng là gì?
R là một ngôn ngữ lập trình chức năng (FP). Điều này có nghĩa là nó cung cấp nhiều công cụ để tạo và thao tác các chức năng. Đặc biệt, R liên quan đến những gì được gọi là các hàm hạng nhất.
Các vấn đề về bộ nhớ
Hầu hết các đối tượng R là bất biến hoặc không thể thay đổi. Do đó, các hoạt động R được thực hiện dưới dạng các hàm gán lại cho đối tượng đã cho, một đặc điểm có thể có ý nghĩa về Performance.
Vấn đề sao chép khi thay đổi
Chúng ta sẽ thảo luận về một tính năng quan trọng của R giúp làm việc với dữ liệu an toàn hơn. Giả sử chúng ta tạo một vectơ số đơn giản x1:
x1 < – c ( 1 , 2 , 3 )
Sau đó, chúng ta gán giá trị của x1 cho x2:
x2 < – x1
Bây giờ, x1 và x2 có cùng giá trị. Điều gì sẽ xảy ra nếu chúng ta sửa đổi một phần tử trong một trong hai vectơ? Cả hai vectơ sẽ thay đổi?
x1 [ 1 ] < - 0 x1 ## [1] 0 2 3 x2 ## [1] 1 2 3
Đầu ra:
Kết quả cho thấy rằng khi thay đổi x1, x2 sẽ không thay đổi. Bạn có thể đoán rằng phép gán tự động sao chép giá trị và làm cho biến mới trỏ đến bản sao của dữ liệu thay vì dữ liệu gốc.
Sử dụng Rprof () để tìm các điểm chậm trong mã của bạn
Nếu mã R của chúng tôi chạy chậm một cách không cần thiết, một công cụ hữu ích để tìm ra thủ phạm là Rprof () :
Giám sát với Rprof ()
Chúng tôi sẽ gọi Rprof () để bắt đầu giám sát, chạy mã của chúng tôi và sau đó gọi Rprof () với đối số NULL để dừng giám sát.
Hồ sơ R mã
Cấu hình mã R cho bạn cơ hội xác định các nút thắt cổ chai và các đoạn mã cần được triển khai hiệu quả hơn chỉ bằng cách thay đổi một dòng của mã từ
x = data.frame (a = biến1, b = biến2) thành x = c ( biến1, biến2 )
Sự giảm thiểu lớn này đã xảy ra vì dòng mã này được gọi nhiều lần trong quá trình thực thi hàm.to
Sử dụng các chức năng cấu hình mã R
Sử dụng Rprof ():
- Rprof là một hàm có trong gói cơ sở utils, được tải theo mặc định.
- Để sử dụng cấu hình R trong mã của chúng ta, chúng ta có thể gọi hàm này và chỉ định các tham số của nó, bao gồm tên vị trí của tệp nhật ký sẽ được ghi.
- Bạn cũng có thể bật và tắt cấu hình trong mã của mình.
Biên dịch mã Byte
Giao diện trình biên dịch
Chúng ta có thể sử dụng trình biên dịch một cách rõ ràng bằng cách gọi một số hàm nhất định để thực hiện quá trình biên dịch hoặc ngầm định bằng cách cho phép quá trình biên dịch diễn ra tự động tại một số điểm nhất định.
JIT là gì?
Nó là một phương pháp để cải thiện Performance thời gian chạy của các chương trình máy tính.
JIT trong R
Có sẵn hai gói R cung cấp khả năng biên dịch kịp thời cho người dùng R: gói {jit} và gói {compiler}.
Gói {JIT}
Gói này là một sáng tạo của Stephen Milborrrow. Nó tạo điều kiện thuận lợi cho việc biên dịch các vòng lặp R và một số biểu thức số học trong thời gian ngắn. Điều này cho phép mã được thực thi nhanh hơn.
Bản tóm tắt
Chúng tôi đã nghiên cứu về Performance của ngôn ngữ R ở các khía cạnh khác nhau. Về cơ bản, R là một ngôn ngữ chậm nhưng có quá nhiều cách có sẵn để tăng tốc ngôn ngữ bằng cách làm theo một cách cụ thể. Chúng ta cũng có thể sử dụng vectơ hóa thay vì vòng lặp để tăng tốc độ và bộ nhớ của R. Các chức năng khác nhau như rprof, biên dịch bytecode cũng có sẵn để điều chỉnh Performance R mà chúng ta đã thảo luận trong hướng dẫn này.