JMP12.2の使用-リストのアイテム数が同じであると仮定して、2つの異なるリストからリストアイテムを1対1で連結する高速な方法を探しています。 これは非常に大きなテーブルの各行に使用されるため、可能であれば反復関数は使用しないことをお勧めします。
これが私が達成したいことの例です:
list1 = {"a"、 "b"、 "c"、 "d"、 "e"、 "f"、 "g"};
list2 = {"1"、 "2"、 "3"、 "4"、 "5"、 "6"、 "7"};
許容できる結果は、文字列またはリストです。 文字列が区切り文字で区切られている場合。
リストの結果:{"a、1"、 "b、2"、 "c、3"、 "d、4"、 "e、5"、 "f、6"、 "g、7"};
文字列の結果: "a:1、b:2、c:3、d:4、e:5、f:6、g:7";
やあ@ ts2 、
結果をどうするかによって、いくつかの異なる方法でアプローチすることができます。 反復関数を実行したくないことはわかっていますが、あるリストの要素が別のリストの要素に接続されている正しい出力を取得するには、Forループを実行する必要があると思います。 連想配列を実行することも検討できます。
以下は、ソリューションの開始に役立つ可能性のあるJSLです。
names default to here(1);
list1 = {"a","b","c","d","e","f","g"};
list2 = {"1","2","3","4","5","6","7"};
AA = Associative Array(List1, List2);
i=.;
result1={};
For(i=1, i<=nitems(list1), i++,
result1[i]=list1[i]||":"||list2[i]
);
result 2 = EvalList({Concat Items(result1, ", ")});
Show(result1);
Show(result2);
Show (AA);お役に立てれば!、
DS
JSLループの評判は不当に悪いです。 ループの内臓が多くの作業を行う場合、通常、ループのオーバーヘッドはそれほど重要ではありません。 また、JSLループのないソリューションでは、どこか別の場所、おそらくC ++でループが発生しますが、これは少し高速ですが、それでもなおです。 とにかく、これは2つの方法の比較です。1つはJSLループを含み、もう1つはJMPのC ++コードに隠されたループを使用します。
約39,000要素での2つのアルゴリズムのクロスオーバー時間を示すグラフ。
dtGraph = New Table( "stats",
Add Rows( 0 ),
New Column( "size", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "table time", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "loop time", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) )
);
For( n = 1, n < 1e7, n *= 2,
dtGraph << addrows( 1 );
dtGraph:size[N Rows( dtGraph )] = n * 3;// 3 items repeated...
list1 = Repeat( {"a", "b", "c"}, n );
list2 = Repeat( {"1", "2", "3"}, n );
start = HP Time(); // data table method begins here
dt = New Table( "temp",
New Column( "a", Character, "Nominal", Set Values( list1 ) ),
New Column( "b", Character, "Nominal", Set Values( list2 ) ),
New Column( "c", Character, "Nominal", formula( a || ":" || b ) ),
invisible
);
dt << runformulas;
result = dt:c << getvalues;
Close( dt, nosave );
stop = HP Time(); // data table method ends here
Show( stop - start );
result = Concat Items( result, "," );
Show( Length( result ), Left( result, 100 ) );
dtGraph:table time[N Rows( dtGraph )] = (stop - start) / 1e6;
result = {};
start = HP Time(); // loop method begins here
While(
a = Remove From( list1, 1 );
b = Remove From( list2, 1 );
N Items( a ); // as long as something was removed...
, // do this...
Insert Into( result, a[1] || ":" || b[1] )
);
stop = HP Time(); // loop method ends here
Show( stop - start );
result = Concat Items( result, "," );
Show( Length( result ), Left( result, 100 ) );
dtGraph:loop time[N Rows( dtGraph )] = (stop - start) / 1e6;
Wait( 1 );
);
dtGraph << Graph Builder(
Size( 1200, 500 ),
Show Control Panel( 0 ),
Variables( X( :size ), Y( :table time ), Y( :loop time, Position( 1 ) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 5 ) ), Smoother( X, Y( 1 ), Y( 2 ), Legend( 6 ) ) ),
SendToReport(
Dispatch( {}, "size", ScaleBox, {Scale( "Log" ), Inc( 1 ), Minor Ticks( 1 )} ),
Dispatch( {}, "table time", ScaleBox, {Scale( "Log" ), Format( "Best", 12 ), Inc( 1 ), Minor Ticks( 1 )} )
)
);JMP 14は、私がアクセスできる最も古いものです。 ループアルゴリズムは、JMP12でも同様のパフォーマンスを発揮すると思います。 古いJMPバージョンではリストに高速インデックスが設定されていなかったため、2つのリストを処理するときに意図的に破棄しますが、最初の要素の削除は高速です。 データテーブルアルゴリズムはループの最初にあるため、リストが破棄される前に使用できます。
JSLを振り返ってみると、どちらのアルゴリズムも単純であるとか、従うのが簡単であると主張するべきではありません。
はい、反復(各行)内の反復(for)がスクリプトのパフォーマンスに深刻な影響を与えると想定していた可能性がありますが、例を作成した後@DiedrichSchmidtパフォーマンスが驚くほど良いことを示唆しました。
比較してくれてありがとう-私はc ++が常に速いと思っていたでしょうが、テーブルが常により多くのオーバーヘッドを持つことは理にかなっています。 「BeginDataUpdate」や「Private」テーブルはテーブルのオーバーヘッドを改善するのだろうか?
これはうまくいきますありがとうございます。 反復関数を使用していても、優れたパフォーマンスを発揮します。
私の問題は解決されました-これはあなたやそれが役に立つと思うかもしれない他の人にとってよりFYIです。
JMP14.3にアクセスできますが、組織内での互換性のために、スクリプトをJMP12.2で実行する必要があります。
私はあなたの分析を試みました、そして、JMP14.3のためにあなたと同様の結果を得ました-おそらく計算能力のいくつかの違い。

ただし、JMP12.2のループのパフォーマンスは完全にラインから外れています。 時間が指数関数的に増加し、24行目に到達することはなかったため、98304以降にJMP.exeプロセスを強制終了する必要があります。
