Melhorando o desempenho de loops numéricos em tcl

1

Estou tentando melhorar o desempenho de um script Tcl. É uma amostra aleatória simples com algoritmo de substituição. Eu sei que é melhor fazer isso em uma linguagem mais numericamente orientada, mas a plataforma em que estou usa Tcl.

Aqui está o código que eu criei, mas é relativamente lento. Leva cerca de 1 segundo por loop para uma lista de entrada de cerca de 100.000 valores de precisão dupla. Eu tenho que processar esse loop centenas de vezes.

proc pSampleWithReplace {list samplesize} {
set v_val {}
for {set j 0} {$j < $samplesize} {incr j} {
        lappend v_val [lindex $list [expr round(rand() * [expr [llength $list] -1])]]
    }
return $v_val
}

Existe algo que eu possa mudar na expressão que pode melhorar o desempenho?

    
por Jonjilla 11.02.2015 / 21:03

1 resposta

2

Você está recalculando o tamanho da lista todas as vezes. Além disso, ajuste suas expressões .

proc pSampleWithReplace {list samplesize} {
    set v_val [list]   ;# you know it's a list, so create it as a list
    set lmax [expr {[llength $list] - 1}]
    for {set j 0} {$j < $samplesize} {incr j} {
        lappend v_val [lindex $list [expr {round(rand() * $lmax)}]]
    }
    return $v_val
}
    
por 11.02.2015 / 21:12

Tags