행렬/목록에서 개별 항목을 얻는 가장 빠른 방법상당히 큰 벡터에서 고유한 항목을 가져오려고 하는데 연관 배열을 만드는 것보다 더 빠른 방법을 아는 사람이 있는지 궁금합니다. 나는 다음을 시도했다.
Names Default to here(1);
dt = open("$SAMPLE_DATA\Probe.jmp");
rows = dt << Get rows Where(Num(:Wafer Number) <= 10);
times = Column(dt, "Start Time")[rows];
//option 1
st = HPTime();
distinct1 = associative array(as list(times));
distinct1 = distinct1 << Get Keys;
opt1 = HPTime()-st;
show(opt1);
//option 2
st = HPTime();
dt_sub = dt << Subset(
Selected Rows( 0 ),
Rows( rows ),
Selected columns only( 0 )
);
Summarize(dt_sub, distinct2 = by(:Start Time));
close(dt_sub, no save);
opt2 = HPTime()-st;
show(opt2);
//option 3
st = HPTime();
distinct3 = [];
for(i=1, i<=nrows(times), i++,
if(!any(distinct3 == times[i]),
distinct3 ||= times[i]
)
);
opt3 = HPTime()-st;
show(opt3);
//option 4
st = HPTime();
distinct4 = {};
for(i=1, i<=nrows(times), i++,
if(!Contains(distinct4, times[i]),
insert into(distinct4, times[i])
)
);
opt4 = HPTime()-st;
show(opt4);
show(nitems(distinct1), nitems(distinct2), nrows(distinct3`), nitems(distinct4));
결과는 다음과 같습니다.
옵션1 = 1082;
옵션2 = 40914;
선택3 = 5853;
선택4 = 8001;
N개의 항목(distinct1) = 211;
N개의 항목(distinct2) = 211;
N 행(distinct3`) = 211;
N개 항목(distinct4) = 211;
*편집* 좋아요, 연관 배열은 부동 소수점 키를 허용하지 않기 때문에 확실히 사용하지 마세요. 모든 것을 반올림합니다. for 루프는 이 작업에서 매우 느린 것 같으므로 누구에게 더 좋은 것이 있습니까?
Re: 행렬/목록에서 개별 항목을 얻는 가장 빠른 방법속도는 비교가 안되지만 타자치는게 더 빠릅니다...
distinct = Design(times, <<LEVELS></LEVELS>
Re: 행렬/목록에서 개별 항목을 얻는 가장 빠른 방법대부분의 세트에 대해 테스트했습니다. 2^52로 스케일링하는 것이 가장 빠른 것 같습니다(허용 가능한 손실 있음). 모든 피드백에 감사드립니다.
Re: 행렬/목록에서 개별 항목을 얻는 가장 빠른 방법요약을 잘 사용합니다.
최상의 솔루션은 크기 문제에 따라 다를 수 있습니다. 큰 설정 오버헤드는 충분히 큰 문제에서 보상을 받을 수 있습니다.
부동 소수점 숫자를 연관 배열의 키로 바꾸는 방법을 조사하고 있었고 숫자로 만든 문자열과 관련된 더 느린 답변만 내놓았습니다.
부동 소수점 숫자를 +/- 2^52 사이의 정수로 확장하고 정수를 사용하여 연관 배열을 인덱싱할 수 있습니다. 예, 2^32도 아니고 2^64도 아닌 2^52입니다. JMP에서 사용하는 8바이트 배정밀도 부동 소수점 숫자에는 52비트 분수가 있습니다. 위키피디아 . 이것은 손실이 많은 변환이지만 대부분의 정보를 유지할 수 있습니다.
Re: 행렬/목록에서 개별 항목을 얻는 가장 빠른 방법시도해 볼 수 있는 또 다른 대안이 있습니다.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\Probe.jmp" );
dt << Select Where( Num( :Wafer Number ) > 10 );
dt << exclude;
dtSumm = dt << Summary(
private,
Group( :Start Time ),
Freq( "None" ),
Weight( "None" ),
statistics column name format( "column" ),
Link to original data table( 0 )
);
dtSumm << delete rows;
Distinct = dtSumm:Start Time << get values;
Close( dtSumm, nosave );
dt << clear row states;
Re: 행렬/목록에서 개별 항목을 얻는 가장 빠른 방법연관 배열을 사용하여 동일한 작업을 수행했습니다. 아시다시피 0보다 작은 숫자/소수점 이하 자릿수가 많은 숫자를 처리하려면 먼저 데이터 샘플을 가져와 좋은 배율 인수가 무엇인지 찾은 다음 벡터 요소의 배율을 조정해야 합니다.
연관 배열을 생성한 후 약간의 행렬 조작을 수행하기 때문에 여전히 for 루프를 사용하는 것보다 더 빠르게 작동하는 것 같습니다.