NetLogo 的 ask-with 是否确保惰性求值?
does NetLogo's ask-with ensure lazy evaluation?
下面两行代码等价多少?
ask agentset [if (attr > 0) [dosomething]]
ask agentset with [attr > 0] [dosomething]
是否存在任何预期的(和可解释的)差异
速度或内存的使用?
特别是,在第二个中使用 with
案例导致创建临时代理集,
或者 ask ... with
组合确保
偷懒评价?
(免责声明:我对编译器的了解非常肤浅,所以我可能会遗漏一些东西。)
此处提供了 NetLogo 编译器执行的优化列表(可能已过时):
https://github.com/NetLogo/NetLogo/wiki/Compiler-architecture#optimizer
那些(在 NetLogo 6.0 中)的实际代码在这里:
据我所知,ask ... with
没有优化。这意味着 ask ... with
会 创建一个中间代理集,因此,可能需要比 ask ... [ if ... ]
.
更多的内存和时间
您应该使用哪一个可能取决于您在 efficiency/readability 权衡中的立场。 (我个人认为 ask ... with
更具可读性。)
优化 ask ... with
是个好主意吗?在我看来,绝对。话虽如此,在编写编译器时可能出于技术原因不这样做。我只是不知道。
确实,ask ... with
没有优化是有充分理由的。并且两个版本之间存在行为差异;这不仅仅是可读性与效率的问题。请参阅布莱恩的回答。
只是为了扩展 Nicolas 所说的内容:
询问是有意不偷懒。考虑代理正在修改其他代理的属性的代码,这些属性决定是否应该询问他们,可以这么说:
to go
ask patches with [ pcolor = red ] [
ask neighbors4 [ set pcolor red ]
]
tick
end
因为with
创建了一个临时座席集,询问的座席不会在询问中更改。这会导致红色区域随着 go
被重复调用而均匀增长:
现在,考虑用 if
代替。
to go
ask patches [
if pcolor = red [
ask neighbors4 [ set color red ]
]
]
tick
end
因为还没有被询问的补丁可能已经变成了红色,所以红色区域增长不均匀:
因此,ask-with 实际上与 ask-if 具有不同的行为,因此无法对其进行优化。也就是说,正如 Nicolas 提到的,一些类似的优化已经完成。
下面两行代码等价多少?
ask agentset [if (attr > 0) [dosomething]]
ask agentset with [attr > 0] [dosomething]
是否存在任何预期的(和可解释的)差异
速度或内存的使用?
特别是,在第二个中使用 with
案例导致创建临时代理集,
或者 ask ... with
组合确保
偷懒评价?
(免责声明:我对编译器的了解非常肤浅,所以我可能会遗漏一些东西。)
此处提供了 NetLogo 编译器执行的优化列表(可能已过时):
https://github.com/NetLogo/NetLogo/wiki/Compiler-architecture#optimizer
那些(在 NetLogo 6.0 中)的实际代码在这里:
据我所知,ask ... with
没有优化。这意味着 ask ... with
会 创建一个中间代理集,因此,可能需要比 ask ... [ if ... ]
.
您应该使用哪一个可能取决于您在 efficiency/readability 权衡中的立场。 (我个人认为 ask ... with
更具可读性。)
优化 ask ... with
是个好主意吗?在我看来,绝对。话虽如此,在编写编译器时可能出于技术原因不这样做。我只是不知道。
确实,ask ... with
没有优化是有充分理由的。并且两个版本之间存在行为差异;这不仅仅是可读性与效率的问题。请参阅布莱恩的回答。
只是为了扩展 Nicolas 所说的内容:
询问是有意不偷懒。考虑代理正在修改其他代理的属性的代码,这些属性决定是否应该询问他们,可以这么说:
to go
ask patches with [ pcolor = red ] [
ask neighbors4 [ set pcolor red ]
]
tick
end
因为with
创建了一个临时座席集,询问的座席不会在询问中更改。这会导致红色区域随着 go
被重复调用而均匀增长:
现在,考虑用 if
代替。
to go
ask patches [
if pcolor = red [
ask neighbors4 [ set color red ]
]
]
tick
end
因为还没有被询问的补丁可能已经变成了红色,所以红色区域增长不均匀:
因此,ask-with 实际上与 ask-if 具有不同的行为,因此无法对其进行优化。也就是说,正如 Nicolas 提到的,一些类似的优化已经完成。