我正在尝试提高 Tcl 脚本的性能。它是具有替换算法的简单随机样本。我知道最好使用更面向数字的语言来完成此操作,但我所在的平台使用 Tcl。
这是我生成的代码,但速度相对较慢。对于大约 100,000 个双精度值的输入列表,每个循环大约需要 1 秒。我必须处理这个循环数百次。
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
}
我可以改变表达方式来提高性能吗?
答案1
您每次都在重新计算列表长度。还,调整你的表情。
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
}