Chapel中如何简洁实现两个字符串域的所有配对组合?
更简洁的Chapel字符串域笛卡尔积实现方法
嘿,刚好Chapel对这种笛卡尔积场景有非常简洁的语法支持,完全不用写嵌套循环!
直接用域迭代器推导式就能一行生成你要的crossDomain:
var crossDomain = domain(string)( (d + "-" + s) for d in dd, s in sd );
原理说明
这个写法里:
(d + "-" + s) for d in dd, s in sd是Chapel的迭代器语法,会自动遍历dd和sd的所有元素配对,把每对拼接成"X-Y"格式的字符串;- 把这个迭代器直接传给
domain(string),就能一次性创建包含所有拼接结果的字符串域,省去了手动初始化域再逐个添加元素的步骤。
对比原来的嵌套循环写法
原来的实现大概是这样:
var crossDomain: domain(string); for d in dd { for s in sd { crossDomain += d + "-" + s; } }
新写法不仅代码量减少了一大半,而且Chapel编译器能对这种推导式结构做针对性优化,运行效率也不会打折扣。
另外你也可以先创建元组类型的笛卡尔积域,再转换为字符串域,这个思路也可行,但上面的写法是最直接的:
// 先得到(string, string)类型的笛卡尔积域 var tupleCrossDomain = dd * sd; // 再转换为字符串域 var crossDomain = domain(string)( t[0] + "-" + t[1] for t in tupleCrossDomain );
内容的提问来源于stack exchange,提问作者Brian Dolan
相关产品推荐
相关产品推荐

