Would it help to use an eq? hash and turn all of the strings into
symbols (hopefully up front)? That might make the hashing part faster
in the best-known function. (Also, you can use two accumulators in the
for*/fold instead of one to avoid creating 'cons' cells but that seems
unlikely to matter much.)

Robby

On Fri, Jan 2, 2015 at 1:44 PM, Greg Hendershott
<greghendersh...@gmail.com> wrote:
> Although it can't hurt, I don't think `train` comes close to
> dominating the time?
>
> Through the sophisticated profiling technique of commenting-out `or`
> branches in `correct`, I got the sense that the third one is the
> issue:
>
>
> (define (correct m s)
>   (let ([best-known (λ (xs) (best-known m xs))])
>     (or (best-known (list s))
>         (best-known (edits1 s))
>         (best-known (append-map edits1 (edits1 s))) <-- if reached, very slow
>         s)))
> real    0m16.527s
> user    0m14.554s
> sys     0m1.859s
>
>
> (define (correct m s)
>   (let ([best-known (λ (xs) (best-known m xs))])
>     (or (best-known (list s))
>         (best-known (edits1 s))
>         (best-known (edits2 m s)) ;; what I posted yesterday
>         s)))
> real    0m9.807s
> user    0m9.463s
> sys     0m0.266s
>
>
> (define (correct m s)
>   (let ([best-known (λ (xs) (best-known m xs))])
>     (or (best-known (list s))
>         (best-known (edits1 s))
>         ;; (best-known (edits2 m s)) ;; skip it entirely
>         s)))
> real    0m2.074s
> user    0m1.708s
> sys     0m0.184s
>
>
> p.s. `best-known` = combining `best` and `known` into a single pass for/fold:
>
> ;; Given a hash map and a list of words, returns
> ;; one of the words with the highest frequency.
> ;; Given an empty list returns #f
> (define (best-known ht xs)
>   (car (for*/fold ([best (cons #f 0)])
>                   ([x (in-list xs)]
>                    [v (in-value (hash-ref ht x #f))] ;; should default be 1?
>                    #:when v)
>          (if (> v (cdr best)) (cons x v) best))))
>
> ... which I thought might be faster but wasn't significant.
>
> ____________________
>   Racket Users list:
>   http://lists.racket-lang.org/users

____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to