scheme - Difference between 3 methods of detecting true in Racket -
it seem big deal there significant differences in following 3 methods of counting number of true items?
#lang racket (define (counttrue . vars) (length (remove* (list #f) vars)) ) (define (counttrue2 . vars) (define c 0) (for ((item vars)) (when item (set! c (add1 c)))) c ) (define (counttrue3 . vars) (count (lambda(x) x) vars) ) they produce identical results there reason why particular 1 should or should not chosen?
edit: on using time function, following results obtained 3 functions above , 2 each answers @chrisjester-young , @sylwester :
"---------- counttrue ------------" cpu time: 751 real time: 751 gc time: 16 "---------- counttrue2 ------------" cpu time: 946 real time: 947 gc time: 10 "---------- counttrue3 ------------" cpu time: 456 real time: 457 gc time: 8 "---------- counttrue_chris1 ------------" cpu time: 726 real time: 727 gc time: 9 "---------- counttrue_chris2 ------------" cpu time: 595 real time: 595 gc time: 8 "---------- counttrue_sylwester1 ------------" cpu time: 543 real time: 544 gc time: 7 "---------- counttrue_sylwester2 ------------" cpu time: 515 real time: 515 gc time: 7 hence, "count lambda" method fastest.
the count version idiomatic (except i'd write (count identity items)). furthermore, set! version not idiomatic racket, , racket doesn't optimise use, can see timing tests.
here couple of alternatives timing pleasure:
using
forcomprehensions:(for/sum ((x (in-list items)) #:when x) 1)manual looping:
(let loop ((sum 0) (items items)) (cond ((null? items) sum) ((car items) (loop (add1 sum) (cdr items))) (else (loop sum (cdr items)))))
Comments
Post a Comment