在 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))
请注意,代码的高效部分应该只是列表的实际求和,而不是生成。
非常感谢。
最佳答案
这是一个简单的版本,使用“向量”:
#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))
在我的机器上运行大约 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))
然后它会在大约 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))
现在它运行大约 20 毫秒。
关于list - Racket 中高效的随机数列表总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8328564/