Dyalog APL:能否将G识别为等价于更高效的F?是否需先判断布尔数组参数?
Dyalog APL中
G与F的等价性及优化问题 直接说结论:
- 无论输入是否为布尔数组,
G(∧/ ,)和F(~0∘∊)的语义完全等价,理论上解释器可将G识别为F的惯用表达式进行优化,以提升执行效率。 - 实现该识别无需预先判断参数类型——因为二者的等价性对所有数值数组都成立,并非仅局限于布尔数组。
代码与逻辑分析
先看你提供的定义和性能测试:
G ∧/ , F ~ 0 ∘∊ v←¯1+∘?¨100 ⍴¨ 1e6⍴2 cmpx 'F¨v' 'G¨v' F¨v → 1.7E¯1 | 0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕ G¨v → 2.4E¯1 | +39% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
G的执行逻辑:先通过,拉平数组,再用∧/对所有元素执行逻辑与运算(APL中0为假、非0为真,因此∧/结果为真当且仅当所有元素非0)。F的执行逻辑:用0∘∊检查数组是否包含0,再通过~取反,结果为真当且仅当数组中无0——与G的语义完全一致。
性能差异原因
F更快的核心是短路优化:0∘∊是专门的元素存在性检查操作,内部实现会在找到第一个0时立即返回结果,无需遍历整个数组;而当前Dyalog APL中∧/的实现未做类似短路处理,必须遍历完所有元素才能得到最终结果,因此效率落后于F。
关于解释器优化可行性
如果Dyalog官方将该等价模式纳入优化规则库,完全可以直接将∧/ ,x替换为~0∘∊x,无需额外判断参数是否为布尔数组——因为二者的等价性覆盖所有数值数组场景。
内容的提问来源于stack exchange,提问作者justin2004
相关产品推荐
相关产品推荐

