a←b←⍳1000⋄a-⊂b⍝这需要永远,有其他选择吗? (gnuapl)

时间:2015-04-10 03:31:48

标签: apl

我正在运行gnuapl 1.5并启用了实验性并行功能。在四个核心上运行以下两行:

一个←←b←⍳x1000

a-⊂b⍝这条线似乎需要很长时间才能计算出来。

对于较小的x值(例如十和一百),此计算没有任何明显的滞后。

任何人都可以推荐与a-⊂b

不同的方法

2 个答案:

答案 0 :(得分:2)

首先,您的输出数据大小以二次方式增加:

      a←b←⍳x←100 ◊ ⍴,⍕ a-⊂b 
33240
      a←b←⍳x←200 ◊ ⍴,⍕ a-⊂b 
146490
      a←b←⍳x←300 ◊ ⍴,⍕ a-⊂b 
349740
      a←b←⍳x←400 ◊ ⍴,⍕ a-⊂b 
642990
      a←b←⍳x←500 ◊ ⍴,⍕ a-⊂b 
1026240
      a←b←⍳x←600 ◊ ⍴,⍕ a-⊂b 
1499490
      a←b←⍳x←700 ◊ ⍴,⍕ a-⊂b 
2062740
      a←b←⍳x←800 ◊ ⍴,⍕ a-⊂b 
2715990
      a←b←⍳x←900 ◊ ⍴,⍕ a-⊂b 
3459240

然后,只有在打印数据时才会出现延迟。 APL2的格式规则很难针对所有情况进行优化。在您的情况下,您的输出行看起来非常长(x←1000为4292490个字符)。 但即便如此,我相信显示数据所需的时间仍然较短 而不是阅读它们的时间。

///Jürgen

答案 1 :(得分:1)

你确定它是计算而不是将结果回显到屏幕上花费时间吗?

我不在GnuAPL上,但在我看来它似乎很快:

B←A-⊂A←⍳1000

这里我将结果分配给B而不是回应它。

另一种选择可能是:

B←,/A∘.-A←⍳1000

实际计算∘.-可能会更快(尽管它会占用大量内存),但将其转换为向量,/的向量很慢。 (代码看起来更酷,但是......)