Posted to tcl by emiliano at Wed Mar 25 17:01:14 GMT 2020view pretty

# striding a list; comparison of times

# using lmap
proc lstride1 {l n} {
    for {set i 0} {$i < $n} {incr i} {
        lappend vars var$i
    }
    lmap $vars $l {
        lmap _ $vars {
            set $_
        }
    }
}

# using lrange 
proc lstride2 {l n} {
    set res {}
    set len [llength $l]
    set from 0
    set to [expr {$n - 1}]
    while {$from < $len} {
        lappend res [lrange $l $from $to]
        incr from $n
        incr to $n
    }
    return $res
}

% llenght $data
567784 
# confirm that both work as intended
% llength [lstride1 $data 14]
40556
% llength [lstride2 $data 14]
40556

% time {lstride $data 14} 5
3195229.4 microseconds per iteration
% time {lstride2 $data 14} 5
128583.0 microseconds per iteration

# Difference is ~ 25X