2013-02-26 42 views
9

Tôi cần tính giá trị trung bình và phương sai của một tập hợp con của một véc-tơ. Hãy để x là véc tơ và y là chỉ báo cho dù quan sát có nằm trong tập con hay không. Đó là hiệu quả hơn:Cách hiệu quả nhất để đặt véc tơ vectơ

sub.mean <- mean(x[y]) 
sub.var <- var(x[y]) 

hoặc

sub  <- x[y] 
sub.mean <- mean(sub) 
sub.var <- var(sub) 
sub  <- NULL 

Cách tiếp cận đầu tiên không tạo ra một đối tượng mới một cách rõ ràng; nhưng thực hiện các cuộc gọi đến meanvar thực hiện điều đó một cách ngầm định? Hay họ làm việc trên vectơ gốc như được lưu trữ?

Thứ hai nhanh hơn bởi vì nó không phải thực hiện việc thuê bao hai lần?

Tôi lo ngại về tốc độ và khả năng quản lý bộ nhớ cho các tập dữ liệu lớn.

+0

Nếu bạn lo lắng về việc làm việc với các tập dữ liệu thực sự lớn, thì bạn sẽ phải di chuyển ra khỏi R (hoặc thực hiện nhiều mẫu). Điều đó sang một bên, tại sao không chuẩn cho hai phương pháp tiếp cận? –

+7

@JackManey: Điều đó không đúng (hoặc mang tính xây dựng), đặc biệt là vì bạn không biết bộ dữ liệu "lớn" của người dùng lớn đến mức nào. –

+2

@JackManey, Với các gói 'ff' và 'ffbase' (và các gói dữ liệu lớn khác), R mã nguồn mở thuần túy có thể khá có khả năng xử lý các tập dữ liệu rất lớn với hiệu quả và tốc độ. Cũng có bằng chứng từ những người Revolutions Analytics rằng R có thể được mở rộng để cung cấp hiệu suất tốt hơn SAS cho công việc "dữ liệu lớn". R không nhất thiết là một chai cổ, mặc dù các gói cơ sở * sẽ * sụp đổ dưới các tập dữ liệu lớn. – Dinre

Trả lời

7

Điểm chuẩn vào một vector có độ dài 10M chỉ ra rằng (trên máy tính của tôi) cách tiếp cận thứ hai là nhanh hơn:

f1 = function(x, y) { 
    sub.mean <- mean(x[y]) 
    sub.var <- var(x[y]) 
} 

f2 = function(x, y) { 
    sub  <- x[y] 
    sub.mean <- mean(sub) 
    sub.var <- var(sub) 
    sub  <- NULL 
} 

x = rnorm(10000000) 
y = rbinom(10000000, 1, .5) 

print(system.time(f1(x, y))) 
# user system elapsed 
# 0.403 0.037 0.440 
print(system.time(f2(x, y))) 
# user system elapsed 
# 0.233 0.002 0.235 

này không surprising- mean(x[y])không phải tạo một đối tượng mới cho mean để hành động, ngay cả khi nó không thêm nó vào không gian tên cục bộ. Do đó, f1 sẽ chậm hơn cho việc phải thực hiện việc thuê bao hai lần (như bạn đã phỏng đoán).

+0

Gói microbenchmark tốt hơn nhiều cho loại so sánh này: 'library (microbenchmark); microbenchmark (f1 (x, y), f2 (x, y)) ' – hadley

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