我正在运行 gnuapl 1.5 并启用了实验性并行功能。在四个核心上运行以下两行:
a←b←⍳x←1000
a-⊂b ⍝这条线似乎需要很长时间来计算。
对于较小的 x 值(例如 10 和 100),此计算没有任何明显的滞后。
谁能推荐与 a-⊂b 不同的方法
我正在运行 gnuapl 1.5 并启用了实验性并行功能。在四个核心上运行以下两行:
a←b←⍳x←1000
a-⊂b ⍝这条线似乎需要很长时间来计算。
对于较小的 x 值(例如 10 和 100),此计算没有任何明显的滞后。
谁能推荐与 a-⊂b 不同的方法
首先,您的输出数据大小呈二次方增长:
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 个字符)。但即便如此,我相信显示数据所需的时间仍然比读取它们的时间短。
/// 于尔根
您确定是计算而不是将结果回显到屏幕上需要时间吗?
我不在 GnuAPL 上,但在我的上它似乎很快:
B←A-⊂A←⍳1000
在这里,我将结果分配给 B 而不是回显它。
一种替代方法可能是:
B←,/A∘.-A←⍳1000
实际计算∘.-
可能会更快(尽管它会占用大量内存),但将其转换为向量的向量,/
很慢。(虽然代码看起来更酷......)