0

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

a←b←⍳x←1000

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

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

谁能推荐与 a-⊂b 不同的方法

4

2 回答 2

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 个字符)。但即便如此,我相信显示数据所需的时间仍然比读取它们的时间短。

/// 于尔根

于 2015-04-11T11:08:20.583 回答
1

您确定是计算而不是将结果回显到屏幕上需要时间吗?

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

B←A-⊂A←⍳1000

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

一种替代方法可能是:

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

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

于 2015-04-10T11:31:08.840 回答