2011-11-30 70 views
3

在球拍中首先生成隨機整數列表並求和的最有效方法是什麼?球拍中有效的隨機數列表總數

我試圖實現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)) 

請注意,代碼的有效部分只應列表的實際金額,而不是產生。

非常感謝。

+0

如果您有興趣節省空間,可以使用構建向量的懶惰版本(例如[Lazy Racket的構建列表](http://docs.racket-lang.org/lazy/index.html) ),這樣一次只有一個元素需要在內存中。 –

回答

6

這裏有一個簡單的版本,使用`向量的:

#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毫秒。

如果我們把它改爲使用類型化的球拍:

#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毫秒。

+0

這是一個很好的答覆,非常感謝。我正在採取我在球拍的第一步,這個單獨的評論給我足夠的材料來研究一段時間! 類型球拍看起來特別有趣。它讓我想起了Ocaml風格的簽名。 – GiantSquid