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

标签 list optimization vector scheme 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))

请注意,代码的高效部分应该只是列表的实际求和,而不是生成。

非常感谢。

最佳答案

这是一个简单的版本,使用“向量”:

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

相关文章:

php - PHP 中的代码循环优化

Java 最终 boolean 优化

python - 在 RK4 算法中使用 lambda 函数

c++ - 如何从 std::vector 搜索并返回项目

python - 用Turtle绘制圆周上等距点的完整图

python - 通过重复应用函数创建列表

python - 如何查看列表是否包含连续数字

list - 序列语法糖([1..6])如何转换为实际的列表语法(1 :2:3. ..6)?

android - 在 Lollipop 崩溃前使用 android vector Drawables

c++ - 使用 std::sort 在自定义类 C++ 中对 vector 进行排序