A faster implementation of stream-constant Chris Jester-Young (31 Oct 2015 00:47 UTC)
|
Re: A faster implementation of stream-constant
Chris Jester-Young
(31 Oct 2015 01:16 UTC)
|
Re: A faster implementation of stream-constant
Arthur A. Gleckler
(02 Nov 2015 18:51 UTC)
|
Re: A faster implementation of stream-constant
John Cowan
(04 Nov 2015 06:10 UTC)
|
Re: A faster implementation of stream-constant
Phil Bewig
(04 Nov 2015 16:06 UTC)
|
Re: A faster implementation of stream-constant
Arthur A. Gleckler
(04 Nov 2015 17:19 UTC)
|
A faster implementation of stream-constant Chris Jester-Young 31 Oct 2015 00:47 UTC
The reference implementation of stream-constant is O(n²) on the number of elements passed in. There's a portable way to improve on that; here's an implementation (based on the reference implementation): (define (stream-constant . objs) (cond ((null? objs) stream-null) ((null? (cdr objs)) (stream-let loop () (stream-cons (car objs) (loop)))) (else (let ((strm (list->stream objs))) (stream-let loop () (stream-append strm (loop))))))) Running `(stream-ref (apply stream-constant (range 5000)) 5000)` takes 8 seconds using the original version, and 4 milliseconds using the new version, both running on DrRacket 6.2.1 on my computer. If it looks good, it'd be nice to see it incorporated into the reference implementation too. Comments welcome. Cheers, Chris.