我在PowerShell中有一个函数string --> string
执行起来很慢,我想 memoize 它,以保留所有输入/输出对以加速一遍又一遍地调用此函数的执行。我可以想到许多复杂的方法来实现这一目标。有人会有什么不太复杂的建议吗?
答案 0 :(得分:3)
嗯,这是一个镜头。我绝对不能说这是一种好的或有效的方法;事实上,即使想出一些有用的东西也很棘手,而PowerShell专家可能会做得更好。
顺便说一下,脚本语言中的大量过度杀伤(全局变量要简单得多),所以这绝对是一种智力练习。
function Memoize($func) {
$cachedResults = @{}
{
if (-not $cachedResults.ContainsKey("$args")) {
echo "Remembering $args..." #for illustration
$cachedResults.Add("$args", $func.invoke($args))
}
$cachedResults["$args"]
}.getnewclosure()
}
function add($a, $b) {
return $a + $b;
}
$add = Memoize ${function:add};
&$add 5 4
&$add 5 4
&$add 1 2
答案 1 :(得分:1)
我不知道在您的情况下编写.NET PowerShell模块是否切实可行。如果是,您可以使用与我的一个项目类似的技术。
步骤:
我的场景有点不同,因为我没有使用哈希。 我的缓存:https://github.com/Swoogan/Octopus-Cmdlets/blob/master/Octopus.Extensions/Cache.cs 用法:https://github.com/Swoogan/Octopus-Cmdlets/blob/master/Octopus.Cmdlets/GetEnvironment.cs
答案 2 :(得分:0)
我想到了一些非常简单的事情,如下所示:
$array = @{}
function memoized
{
param ([string] $str)
if ($array[$str] -eq $null)
{
$array["$str"] = "something complicated goes on here"
}
return $array[$str]
}
memoized "testing"