gpt4 book ai didi

list - Racket 中高效的随机数列表总和

转载 作者:行者123 更新时间:2023-12-03 16:32:04 32 4
gpt4 key购买 nike

在 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com