문자열 목록을 편집하는 가장 빠른 방법문자열 목록을 필터링하려고합니다. 예로서:
2 목록, 필터 1, 두 번째 목록을 세 번째 후 첫 번째 목록 문자가 일치하지 않는 경우 두 목록을 연결할 싶습니다. 그래서 예를 들어 "a3232", "32"는 이것을 위반하지만 "a32323", "32"는 그렇지 않습니다.
필터 2는 하이픈 (또는 어떤 문자가 당신의 공상에 어울리는 지)을 제거하고 싶습니다.
필터링 된 목록을 반환하는 빠른 예제 함수를 만들었지 만 실제 코드에서는 꽤 오랜 시간이 걸립니다.
비슷한 일을 빨리하는 행운을 누군가가 가지고 있는지 궁금합니다.
Names Default to here(1);
x = {{"a2232", "b12", "c-", "d3341234", "e12647859"}, {"32", "32", "54", "", "64"}};
filterfunc = function({bothlists},
{DEFAULT LOCAL},
f = Expr(column(dt, "1")[]||column(dt, "2")[]);
dt = New Table("Test", private,
New Column("1", character, set values(bothlists[1])),
New Column("2", character, set values(bothlists[2])),
//New Column("First 3", character, Formula(Left(column(dt, "1")[], 3))),
New Column("Remainder", character, Formula(Right(column(dt, "1")[], length(column(dt, "1")[])-3))),
New Column("Filter", character ),
);
filter1 = 1; // filter to remove duplicates from of remainder
//after the first 3 of column 1 and the total of column 2
filter2 = 1; //filter to remove hyphens
if(filter1,
Substitute into(f,
Expr(column(dt, "2")[]),
Expr(if(Column(dt, "Remainder")[] != column(dt, "2")[],
column(dt, "2")[],
""
))
)
);
if(filter2,
Substitute into(f,
nameexpr(f),
EvalExpr(Substitute(Expr(nameexpr(f)), "-", ""))
)
);
Column(dt, "Filter") << Formula(nameexpr(f));
dt << Run Formulas;
values = Column(dt, "Filter") << Get Values;
close(dt, no save);
values;
);
st = HPTime(); //start of routine
filtered_stuff = filterfunc(x);
tot = HPTime() - st;
show(tot);
나는 필터 선택을 준비하는 것에 대해 생각해 보았습니다.하지만 필터의 수가 증가함에 따라 이것이 2 ^ n 문제가되고, 시작 시간이 걱정됩니다.
다시 : 문자열의 목록을 편집하는 가장 빠른 방법이것은 실제로 계산이 아니며 속도가 더 빨라야하므로 GUI 요소에 가깝습니다. 시도한 결과는 다음과 같습니다.
JMP 13.1에서 루프로 실행 : 7.7 초
JMP에서 데이터 테이블로 실행 13 3.3 초
JMP 12.2에서 루프로 실행 : 2 분 이상
JMP 12.2의 데이터 테이블로 실행 : 3.5 초
루프로 어떻게 속도가 증가하는지 모르겠습니다.
다시 : 문자열의 목록을 편집하는 가장 빠른 방법목록의 항목을 반복하는 것의 한 가지 점은 진행 상황을 보여주는 대화 상자 창을 구성 할 수 있다는 것입니다.

느린 계산은 사용자가 기다려야하는 시간과 완료 시간이 예상보다 길면 중단 할 수있는시기를 알면 사용자가 훨씬 더 수용 할 수 있습니다.
다시 : 문자열의 목록을 편집하는 가장 빠른 방법목록에있는 항목 수를 100 만 개로 늘 렸습니다. 첫 번째 방법은 14 초, 두 번째 방법은 7 초, 세 번째 방법은 5 초가 걸렸습니다. 이것은 버전 13과 같기 때문에 큰 목록의 성능을 개선 한 것처럼 보입니다.
다시 : 문자열의 목록을 편집하는 가장 빠른 방법어떤 JMP 버전을 사용하고 있습니까? 나는리스트가 13 개로 향상되었다는 것을 안다. 그러나 for 루프에서 그들을하는 것이 정말 느리다 (나는 12.2를 돌리고있다) 그래서 1,000,000 개의 아이템리스트를 얻었다.
또한 필자는 모든 필터를 동시에 수행해야하므로 필터 식을 먼저 동적으로 작성해야만하므로이를 평가해야합니다.
다시 : 문자열의 목록을 편집하는 가장 빠른 방법나는 진실성이 너무 많아서이 코드를 이해하기 어렵게 만들었다. 그래서 나는 단순화 된 버전을 만들었다.
다음은 코딩 구조를 사용하여 2 차 필터에 초점을 맞춘 단순화 된 코드입니다.
t1 = HpTime();
bothlists = {{"a2232", "b12", "c-", "d3341234", "e12647859"}, {"32", "32", "54", "", "64"}};
dt = New Table("Test",Private,
New Column("1", character, Set Values(bothlists[1])),
New Column("2", character, Set Values(bothlists[2])),
New Column("Filter", character)
);
f = Expr(column(dt, "1")[]||column(dt, "2")[]);
Substitute into(f,
nameexpr(f),
EvalExpr(Substitute(Expr(nameexpr(f)), "-", ""))
);
Column(dt, "Filter") << Formula(nameexpr(f));
dt << Run Formulas;
values = Column(dt, "Filter") << Get Values;
t2 = HpTime();
show(t2-t1);
show(values);
내 컴퓨터에서 HP Time Difference는 약입니다. 2000 년 .
다음으로, 표현식과 evals 등의 사용을 피하기 위해 코드를 다시 작성했습니다.
t1 = HpTime();
bothlists = {{"a2232", "b12", "c-", "d3341234", "e12647859"}, {"32", "32", "54", "", "64"}};
dt = New Table("Test", Private,
New Column("1", character, Set Values(bothlists[1])),
New Column("2", character, Set Values(bothlists[2])),
New Column("Filter", character)
);
Column(dt, "Filter") << Formula(
Substitute( :Name( "1" ) || :Name( "2" ), "-", "" )
);
dt << Run Formulas;
values = Column(dt, "Filter") << Get Values;
t2 = HpTime();
show(t2-t1);
show(values);
보고 된 HP 시간차 차이가 약 ~ 25 % 1500 .
테이블은 비공개 인 경우에도 비싸지 만 사용하지 않는 코드는 다음과 같습니다.
t1 = HpTime();
bothlists = {{"a2232", "b12", "c-", "d3341234", "e12647859"}, {"32", "32", "54", "", "64"}};
lst = {};
For (i=1,i<=NItems(bothlists[1]),i++,
lst[i] = Substitute( bothlists[1][i] || bothlists[2][i], "-", "" )
);
t2 = HpTime();
show(t2-t1);
show(lst);
이 코드에 대해보고 된 HP Time Difference가 100 .