如何在短短几秒钟内创建多达200-500万个数字的序列

问题描述 投票:0回答:1

我需要在最短的时间内创建一个数字序列,理想情况下是在微秒范围内。该序列的总长度通常在20至10万个数字范围内,但是有时我需要创建一个200至300万个数字的序列。目前,我已经用R实现了我的代码(只是因为我非常了解该语言)。假设我的序列应从1开始到25,以0.0001为增量,我会这样做]

s <- seq(1, 25, by = 0.0001)

尽管速度非常快,但要花几毫秒才能完成

> library(microbenchmark)
> microbenchmark(seq(1, 25, by = 0.0001))
Unit: milliseconds
                   expr    min      lq     mean median     uq     max neval
 seq(1, 25, by = 1e-04) 1.6098 2.14505 3.741858 2.2324 2.3554 83.8912   100

我的问题:

1-是否可以使R中的序列生成更快?理想情况下<0.5毫秒

2-在某些时候,我需要用另一种(更快的)语言来实现代码,任何一种语言都能够在不到100-200微秒的时间内生成这样的序列吗?

r seq
1个回答
0
投票

[seq.int()快30-40%。]

microbenchmark::microbenchmark(
  seq = seq(1, 25, by = 0.0001),
  seq.int = seq.int(1, 250000, by = 1) / 10000
)

# Unit: milliseconds
#    expr    min      lq     mean median      uq     max neval
#     seq 2.0749 2.16525 3.375812 2.2222 2.31935 95.9553   100
# seq.int 1.3184 1.35860 1.458503 1.3855 1.42940  6.9268   100

还请注意浮点错误!

sprintf("%.100f", seq(0,0.01,0.0001) )
  [1] "0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
  [2] "0.0001000000000000000047921736023859295983129413798451423645019531250000000000000000000000000000000000"
  [3] "0.0002000000000000000095843472047718591966258827596902847290039062500000000000000000000000000000000000"
  [4] "0.0003000000000000000279290479632265942200319841504096984863281250000000000000000000000000000000000000"
  [5] "0.0004000000000000000191686944095437183932517655193805694580078125000000000000000000000000000000000000"
  [6] "0.0005000000000000000104083408558608425664715468883514404296875000000000000000000000000000000000000000"
  [7] "0.0006000000000000000558580959264531884400639683008193969726562500000000000000000000000000000000000000"
© www.soinside.com 2019 - 2024. All rights reserved.