在Racket中有效的随机数列表和

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)

请注意,代码的有效部分应该只是列表的实际总和,而不是生成.

非常感谢.

Sam*_*adt 6

这是一个简单的版本,使用`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毫秒.