2012-04-13 44 views
9

Tôi đang xem xét việc chuyển đổi tập lệnh R thành mã C vì lý do tốc độ và khả năng để nó được đóng gói dưới dạng .exe. Tôi mới đến C.Chuyển đổi mã R thành mã C

Câu hỏi của tôi sẽ nhanh hơn đáng kể trong C? Bước giới hạn tốc độ là một thuật toán sắp xếp phải được áp dụng nhiều lần cho các vectơ lớn. Tôi không chắc chắn nếu các chức năng vectorized trong R sẽ giúp điều này hoặc làm chậm nó xuống. Tôi cũng đã đọc rằng các vòng lặp không hiệu quả trong R.

Nếu tôi làm điều này trong C, thư viện nào có thể giúp tôi bắt chước một số hàm xử lý dữ liệu của R như thao tác ma trận cơ bản? Tôi nên tìm ở đâu để bắt đầu? Ngay bây giờ tôi thậm chí không biết cách đọc dữ liệu của mình vào C (tệp văn bản được phân tách bằng dấu phẩy).

+1

Bạn muốn đạt được tốc độ nào? Tại sao bạn nghĩ rằng R sẽ chậm hơn đáng kể so với C đối với các hoạt động này? Bạn đã học http://stackoverflow.com/questions/1330944/speed-of-r-programming-language chưa? –

+0

nói riêng, 'rowSums' và' colSums' đã khá nhanh - có thể bạn sẽ không thể ép một lượng lớn hiệu năng ở đó (và bạn nên xem xét hỗ trợ ma trận thưa thớt khá phong phú trong 'Ma trận' gói, nếu ma trận của bạn là thưa thớt ...). Bạn có thể cụ thể hơn một chút về "khả năng để nó chạy máy của người dùng khác" không? –

+1

Điều đó sẽ có rất nhiều công việc, đặc biệt. kể từ khi bạn bắt đầu từ đầu với lập trình C. Bạn có thể [cài đặt R] (http://cran.r-project.org/bin/windows/rw-FAQ.html) trên các máy người dùng trong thời gian ít hơn so với việc chuyển đổi mã R bằng tay. – hardmath

Trả lời

10

Tôi sẽ cố gắng trả lời câu hỏi này cũng như tôi có thể.

... nhưng câu hỏi KHÔNG yêu cầu của bạn có lẽ phù hợp hơn: Thuật toán R có thể được thực hiện nhanh hơn trong R không? Câu trả lời ở đây thường là "có". Nó có thể là "đủ nhanh" không? Vâng, đó là không thể trả lời mà không cần cố gắng (và nhìn thấy mã R hiện tại).

Q: Thuật toán R của tôi có nhanh hơn trong C không?

A: Vâng! Nếu bạn viết mã C "tốt nhất" cho thuật toán, nó sẽ rất có thể nhanh hơn. Nó rất có thể cũng sẽ là nhiều hơn nhiều việc hơn để làm như vậy.

Hỏi: Có thể sắp xếp các vectơ lớn được thực hiện nhanh hơn trong C?

A: Có. Sử dụng đa luồng, bạn có thể cải thiện tốc độ khá nhiều. ... Nhưng hãy bắt đầu bằng cách gọi số sort(x, method='quick') trong R và xem điều đó có cải thiện mọi thứ không! Phương pháp mặc định không phải là rất nhanh cho dữ liệu ngẫu nhiên.

x <- runif(1e7) 
system.time(sort(x))     # 2.50 secs 
system.time(sort(x, method='quick')) # 1.37 secs 
#system.time(tommysort(x))    # 0.51 secs (4 threads) 

Q: Thư viện nào bắt chước chức năng cơ bản của R?

A: LAPACK/BLAS xử lý phép toán ma trận trong R. Nếu bạn cần, bạn có thể tìm thấy các thư viện nhanh hơn nhiều so với vani trong R (bạn có thể sử dụng một số trong R để cải thiện hiệu suất!) .

More info on BLAS

Một cách khác là để thực hiện một .Call từ R đến C và từ đó bạn có quyền truy cập vào tất cả các chức năng R! Gói inline và gói Rcpp có thể giúp bạn dễ dàng hơn.

Cách thứ ba là nhúng R trong ứng dụng của bạn. Rinside có thể giúp dễ dàng hơn.

Hỏi: Làm cách nào để đọc dữ liệu CSV vào C?

A: Hãy xem các chức năng fopenfscanf. ... và sử dụng chúng để viết chức năng nhập dữ liệu.

+0

Nền tảng đích phải là Windows (.exe được đề cập), và có lẽ AMD64 (32-bit là cũ, và hầu như không ai sở hữu một Itanium). Một BLAS tốt sẽ sử dụng AVX trong AMD64, có thể tăng tốc mã một cách đáng kể (thay vào đó là một vòng lặp, dĩ nhiên). Và ngay cả trong C, nhận xét của Dirk ở trên áp dụng: hồ sơ, hồ sơ, hồ sơ. –

+0

Cảm ơn bạn đã phản hồi chi tiết! – JoshDG

Các vấn đề liên quan