如何在PowerShell中记忆功能?

时间:2014-11-21 14:36:36

标签: powershell memoization

我在PowerShell中有一个函数string --> string执行起来很慢,我想 memoize 它,以保留所有输入/输出对以加速一遍又一遍地调用此函数的执行。我可以想到许多复杂的方法来实现这一目标。有人会有什么不太复杂的建议吗?

3 个答案:

答案 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模块是否切实可行。如果是,您可以使用与我的一个项目类似的技术。

步骤:

  1. 将您的功能重写为cmdlet
  2. 拥有一个静态类,其中包含存储结果的静态哈希表
  3. 向cmdlet添加-Cache标志,以便您可以使用和不使用缓存(如果需要)运行它。
  4. 我的场景有点不同,因为我没有使用哈希。 我的缓存: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"