文字列のリストを編集するための最速の方法私は文字列のリストのリストをフィルタリングしようとしています。 例として:
私は2つのリストを持っています、フィルター1のために、私は2番目のリストが3番目の後の最初のリストの文字と一致しないなら2つのリストを連結したいです。 たとえば、"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秒
ループによってどのようにスピードが上がるのか、私にはわかりません。
再:文字列のリストを編集するための最速の方法リスト内の項目を反復処理する1つの利点は、進行状況を示すダイアログウィンドウを作成できることです。

遅い計算は、ユーザーが待つ時間を知っているとき、および完了時間が予想より長い場合に中止するオプションがあるときに、ユーザーにとってはるかに受け入れられやすいものです。
再:文字列のリストを編集するための最速の方法リストの項目数を100万に増やしました。 最初の方法では14秒、2番目の方法では7秒、3番目の方法では5秒かかりました。 これはバージョン13のものなので、大きなリストのパフォーマンスを向上させるという点ではうまくいっているようです。
再:文字列のリストを編集するための最速の方法どのバージョンのJMPを使用していますか?私はリストが13で拡張されたことを知っていますが、私は1,000,000アイテムのリストを持っているのでforループでそれらをするのは本当に遅いです(私は12.2を実行しています)。
また、すべてのフィルタを同時に処理する必要があるので、まずフィルタ式を動的に構築してから評価する必要があります。
再:文字列のリストを編集するための最速の方法私はこのコードを理解するのが非常に豊富なevalsなどによって困難になっていると思うので、私は簡易版を作成しました。
これは、コーディング構造を使用した、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の時差は約です 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 TIme Differenceが25%向上し、パフォーマンスが約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時差は、 100 。