Tôi mới vào R (Revolution Analytics R) và đã được dịch một số chức năng Matlab vào R.Tại sao R chậm trên chức năng hoán vị ngẫu nhiên này?
Câu hỏi: Tại sao là hàm GRPdur (n) để làm chậm?
GRPdur = function(n){
#
# Durstenfeld's Permute algorithm, CACM 1964
# generates a random permutation of {1,2,...n}
#
p=1:n # start with identity p
for (k in seq(n,2,-1)){
r = 1+floor(runif(1)*k); # random integer between 1 and k
tmp = p[k];
p[k] = p[r]; # Swap(p(r),p(k)).
p[r] = tmp;
}
return(p)
}
Dưới đây là những gì tôi nhận được trên một Dell Precision 690, 2xQuadcore Xeon 5345 @ 2.33 GHz, Windows 7 64-bit:
> system.time(GRPdur(10^6))
user system elapsed
15.30 0.00 15.32
> system.time(sample(10^6))
user system elapsed
0.03 0.00 0.03
Dưới đây là những gì tôi nhận được trong Matlab 2011b
>> tic;p = GRPdur(10^6);disp(toc)
0.1364
tic;p = randperm(10^6);disp(toc)
0.1116
Dưới đây là những gì tôi nhận được trong Matlab 2008a
>> tic;p=GRPdur(10^6);toc
Elapsed time is 0.124169 seconds.
>> tic;p=randperm(10^6);toc
Elapsed time is 0.211372 seconds.
>>
LIÊN KẾT: GRPdur là một phần của RPGlab, một gói chức năng Matlab mà tôi đã viết tạo và kiểm tra các trình tạo hoán vị ngẫu nhiên khác nhau. Các ghi chú có thể được xem riêng tại đây: Notes on RPGlab.
Bản gốc chương trình Durstenfeld Algol là here
Chỉ tò mò: bạn đã thử mã vòng lặp trong Matlab chưa? –
Bởi vì mỗi khi bạn sửa đổi một đối tượng trong r, một bản sao được thực hiện. – hadley
Tôi có thể giảm thời gian của phiên bản R theo hệ số 10 hoặc bằng cách vectơ đúng cách tạo 'r' bên ngoài vòng lặp và sau đó sử dụng trình biên dịch byte của R trên nó (Matlab thực hiện biên dịch JIT theo mặc định?). – joran