有没有一种快速方法可以在不使用 for 循环的情况下创建一个大列表?许多编程语言都有某种形式。
例如制作一个从 1 到 100 的列表:
list = 1:100,
或者
list = range(1,100)
或者
list = {1..100}
或者
list = seq(1,100)
让我知道! 我在脚本指南中找不到任何内容。
回复:有没有一种快速方法可以在不使用 for 循环的情况下创建一个大列表?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />这个分析器工具将会派上用场。感谢您分享。
看起来你是对的,它似乎运行得更快的原因是代码中存在更大的瓶颈。看起来“::”矩阵代码确实比直观的 for 循环运行得更快。我通过比较第 10+11 行中的 % 与第 31 行中的 % 得到这一点。
我当前的代码永远不会比较大量数据,但我仍然很好奇,因为我预见为大量数据构建类似的脚本,并且摆脱 for 循环是使代码更快的普遍可靠方法。
回复:有没有一种快速方法可以在不使用 for 循环的情况下创建一个大列表?不错的性能测试。
JSL 有一个分析器可以帮助回答性能问题:

我运行它得到这个:

这告诉我将值设置到关联数组中是此代码中的瓶颈。(第 10 行与第 11 行。)(第 23 行可能包括第一次打开日志,忽略它;第 42 行更具代表性。)
大班只有40行。如果您有更多行(10K?),您可能会看到其他瓶颈。不要调用 temparray<
看起来您正在尝试为列中的每个唯一值创建一个小连续整数的查找表。可能有一种聪明的方法可以做到这一点,但我现在还没有看到。也许其他人会...也许一些数据库连接操作?
回复:有没有一种快速方法可以在不使用 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." ) );
回复:有没有一种快速方法可以在不使用 for 循环的情况下创建一个大列表?
a=3;
b=9;
AsList(a::b)[1]
结果是:
{3, 4, 5, 6, 7, 8, 9}
这里发生了几件事: a::b 生成一行矩阵: [3 4 5 6 7 8 9]
AsList( ... ) 将矩阵转换为列表列表(因为它实际上是二维的,其中一个维度仅为 1。
[1]提取内部列表。
也许您只想要矩阵而不是列表。如果您对快速代码感兴趣,请尽可能使用内置矩阵函数。
这不是来自其他编程语言的神奇迭代器;它是一个迭代器。它将要在内存中创建完整的矩阵和列表,因此您可能不想创建包含十亿个项目的列表。