Tcl 스크립트의 성능을 향상시키려고 합니다. 대체 알고리즘을 사용한 단순 무작위 표본입니다. 나는 이것이 보다 수치 지향적인 언어를 사용하는 것이 가장 좋다는 것을 알고 있지만, 내가 사용하고 있는 플랫폼은 Tcl을 사용합니다.
다음은 제가 생성한 코드이지만 상대적으로 느립니다. 약 100,000개의 double 값으로 구성된 입력 목록의 경우 각 루프에 약 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
}