for ループを使わずに大きなリストを簡単に作成する方法はありますか?多くのプログラミング言語には何らかの形式があります。
たとえば、 1 から 100 までのリスト:
list = 1:100,
または
list = range(1,100)
または
list = {1..100}
または
list = seq(1,100)
お知らせ下さい! スクリプトガイドには何も見つかりませんでした。
Re: for ループを使わずに大きなリストを簡単に作成する方法はありますか?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />このプロファイラーツールは便利です。共有してくれてありがとう。
それは正しいようです。高速に実行されないように見える理由は、コード内に大きなボトルネックがあるためです。「::」行列コードは、直観的な for ループよりも高速に実行されるようです。これは、10+11 行目の % と 31 行目の % を比較することでわかります。
私の現在のコードでは大規模なデータセットを比較することはありませんが、大量のデータに対して同様のスクリプトを構築し、for ループを取り除くことがコードを高速化する一般的な確実な方法であることが予想されるため、それでも興味がありました。
Re: for ループを使わずに大きなリストを簡単に作成する方法はありますか?素晴らしいパフォーマンステスト。
JSL には、パフォーマンスに関する質問に答えるのに役立つプロファイラーがあります。

これを取得するために実行しました:

これは、連想配列に値を設定することがこのコードのボトルネックであることを示しています。(行 10 と行 11。) (行 23 には、おそらく初めてログを開くことが含まれていますが、それは無視してください。行 42 がより代表的です。)
Big クラスには 40 行しかありません。さらに多くの行 (10K?) がある場合は、他のボトルネックが見つかる可能性があります。temparray<
列内のそれぞれの一意の値に対して、連続する小さな整数のルックアップ テーブルを作成しようとしているようです。これを行うための賢い方法があるかもしれませんが、今のところそれは見つかりません。もしかしたら他の誰かが行うかもしれません...データベース結合操作かもしれません?
Re: for ループを使わずに大きなリストを簡単に作成する方法はありますか?ありがとう、これは役に立ちます。これによりコードが高速化されることを期待していましたが、for ループでも同様の速度があるように感じられ、驚いています。助言がありますか?
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
t1 = tick seconds();
numberarray = Function({list},
temparray = Associative Array(list);
tempnum = nitems(temparray << Get Keys);
tempitems = temparray << Get Keys;
templist = {};
For(l=1, l<=tempnum, l++, insertinto(templist, l));
temparray = Associative Array(tempitems, templist);
//return(temparray)
);
for(i=1, i<=100,i++,
array = numberarray( Column(dt, 1) );
array2 = numberarray( Column(dt, 2) );
array3 = numberarray( Column(dt, 3) );
array4 = numberarray( Column(dt, 4) );
array5 = numberarray( Column(dt, 5) ););
t2 = tick seconds();
Print( Concat( Char( t2 - t1 ), " seconds." ) );
t1 = tick seconds();
numberarray = Function({list},
temparray = Associative Array(list);
tempnum = nitems(temparray << Get Keys);
tempitems = temparray << Get Keys;
temparray = Associative Array(tempitems, 1::tempnum);
);
for(i=1, i<=100,i++,
array = numberarray( Column(dt, 1) );
array2 = numberarray( Column(dt, 2) );
array3 = numberarray( Column(dt, 3) );
array4 = numberarray( Column(dt, 4) );
array5 = numberarray( Column(dt, 5) ););
t2 = tick seconds();
Print( Concat( Char( t2 - t1 ), " seconds." ) );
Re: for ループを使わずに大きなリストを簡単に作成する方法はありますか?
a=3;
b=9;
AsList(a::b)[1]
結果:
{3, 4, 5, 6, 7, 8, 9}
ここではいくつかのことが起こっています: a::b は 1 行の行列を作成します: [3 4 5 6 7 8 9]
AsList( ... ) は、行列をリストのリストに変換します (これは実際には 2 次元であり、次元の 1 つが 1 であるためです。
[1] は内部リストを抽出します。
おそらく、リストではなく行列が必要なだけかもしれません。高速なコードに興味がある場合は、可能な場合は組み込みの行列関数を使用してください。
これは、他のプログラミング言語の魔法のイテレータではありません。それ意思完全な行列とリストをメモリ内に作成するため、おそらく 10 億項目のリストを作成する必要はありません。