Ser*_*lla 3 optimization scheme list vector racket
在Racket中首先生成然后求和随机整数列表的最有效方法是什么?
我试图在https://scottlocklin.wordpress.com/2011/11/30/only-fast-languages-are-interesting中实现相当的代码,但我只能提出缓慢的实现.
我的第一次天真尝试(不是随机整数,但无论如何):
(define (sum-list l)
(if (null? l)
0
(+ (first l) (sum-list (rest l)))))
(define avector
(build-vector 3000000 add1))
(time (sum-list avector))
Run Code Online (Sandbox Code Playgroud)
请注意,代码的有效部分应该只是列表的实际总和,而不是生成.
非常感谢.
这是一个简单的版本,使用`vector's:
#lang racket
(define N 3000000)
(define avector
(for/vector #:length N ([i (in-range N)]) (random)))
(define (sum-vec v)
(for/fold ([i 0.0]) ([e (in-vector v)]) (+ e i)))
(time (sum-vec avector))
Run Code Online (Sandbox Code Playgroud)
在我的机器上运行大约250毫秒.
如果我们切换到使用flvector:
#lang racket
(require racket/flonum)
(define N 3000000)
(define avector
(for/flvector #:length N ([i (in-range N)]) (random)))
(define (sum-vec v)
(for/fold ([i 0.0]) ([e (in-flvector v)]) (+ e i)))
(time (sum-vec avector))
Run Code Online (Sandbox Code Playgroud)
然后它在大约60毫秒内运行.
如果我们将其更改为使用Typed Racket:
#lang typed/racket
(require racket/flonum)
(define N 3000000)
(define avector
(for/flvector #:length N ([i (in-range N)]) (random)))
(: sum-vec : FlVector -> Float)
(define (sum-vec v)
(for/fold ([i 0.0]) ([e (in-flvector v)]) (+ e i)))
(time (sum-vec avector))
Run Code Online (Sandbox Code Playgroud)
现在它运行大约20毫秒.
| 归档时间: |
|
| 查看次数: |
735 次 |
| 最近记录: |