Clojure 生成非惰性数字列表的最快方法

Clojure 生成非惰性数字列表的最快方法,clojure,Clojure,我想找到在clojure中生成非惰性数字列表的最快方法。目前我正在使用以下工具: (doall (take 5000000 (iterate inc 5000000000))) 生成一个介于50亿和50.05亿之间的非惰性数字列表。有没有更快的方法?谢谢 (另一方面,我知道使用列表存储数字序列是次优的。但是我将其用作Shen.java编译器的基准)doall通常是您需要的。但你说的“最快”是什么意思?在性能或编码方面最快?实际上,doall非常有效。您的示例唯一的问题是迭代函数的速度慢。您应该

我想找到在clojure中生成非惰性数字列表的最快方法。目前我正在使用以下工具:

(doall (take 5000000 (iterate inc 5000000000)))
生成一个介于50亿和50.05亿之间的非惰性数字列表。有没有更快的方法?谢谢


(另一方面,我知道使用列表存储数字序列是次优的。但是我将其用作Shen.java编译器的基准)

doall通常是您需要的。但你说的“最快”是什么意思?在性能或编码方面最快?

实际上,
doall
非常有效。您的示例唯一的问题是迭代函数的速度慢。您应该使用以下选项代替它:

(doall (range 5000000000 5005000000))
范围
非常快。它是懒惰的,但它进行了优化,并生成了大量的数字

以下是使用以下方法获得的
iterate
run
的基准测试结果:

如您所见,
range
比这里的
iterate
快2.5倍

在我的电脑上,生成所有5000000个数字只需不到一秒钟的时间,但有一些技巧可以让它运行得更快

例如,您可以在单独的线程中运行生成:

(let [numbers (range 5000000000 5005000000)]
  (future (dorun numbers))
  ...)

它不会加快生成速度,但在完全实现之前,您可以立即使用序列。

您想要一种快速的方法来填充缓慢的数据结构吗?您可以使用
范围
@alisterley:quickest way not fast指定开始和结束(以及步骤)。我知道我的方法不是最快的方法来填充list@A.Webb:谢谢,这似乎是最快的方式。这是回答还是评论?那太棒了,谢谢。java最初是在4s中完成的,而使用clojure iterate需要7s,我知道我一定是做clojure版本太慢了!严格地说,这个答案是关于生成和实现一个,而不是像标题中提到的那样创建一个。对于列表,您需要执行类似于
(进入'()(范围50000000005000000))
(或
(进入'()(范围5005000000 5000000000-1))
的操作以保持顺序)。但我从上下文中了解到,这不是你们需要的。@PawełŁoziński谢谢,是的,我想要这份清单。现在Culjule4s与Shen.java相当。
(let [numbers (range 5000000000 5005000000)]
  (future (dorun numbers))
  ...)