小编典典

在python中生成1,000,000+随机数的最快方法

python

我目前正在用python写一个需要生成大量随机数FAST的应用程序。目前,我有一个计划使用numpy生成一个大批处理中的所有数字(一次约500,000)。虽然这似乎比python的实现要快。我仍然需要它来加快速度。有任何想法吗?我愿意用C编写并将其嵌入程序或执行所需的操作。

限制随机数:

  • 一组7个数字,可以全部具有不同的界限:
    • 例如:[0-X1、0-X2、0-X3、0-X4、0-X5、0-X6、0-X7]
    • 目前,我正在生成7个具有[0-1]随机值的数字的列表,然后乘以[X1..X7]
  • 一组13个数字加起来等于1
    • 目前仅生成13个数字,然后除以它们的总和

有任何想法吗?是否可以预先计算这些数字并将它们存储在文件中,从而使速度更快?

谢谢!


阅读 211

收藏
2020-12-20

共1个答案

小编典典

您可以通过执行您最初描述的操作(生成一堆随机数并相应地相乘和相除)来加快上述mtrw的速度…

另外,您可能已经知道这一点,但是在使用大型numpy数组时,请确保就地进行操作(* =,/ =,+
=等)。对于大型数组,这在内存使用方面产生了巨大的差异,并且还将显着提高速度。

In [53]: def rand_row_doubles(row_limits, num):
   ....:     ncols = len(row_limits)
   ....:     x = np.random.random((num, ncols))
   ....:     x *= row_limits                  
   ....:     return x                          
   ....:                                       
In [59]: %timeit rand_row_doubles(np.arange(7) + 1, 1000000)
10 loops, best of 3: 187 ms per loop

相比于:

In [66]: %timeit ManyRandDoubles(np.arange(7) + 1, 1000000)
1 loops, best of 3: 222 ms per loop

差别不大,但是如果您 真的 担心速度,那就好了。

只是为了证明它是正确的:

In [68]: x.max(0)
Out[68]:
array([ 0.99999991,  1.99999971,  2.99999737,  3.99999569,  4.99999836,
        5.99999114,  6.99999738])

In [69]: x.min(0)
Out[69]:
array([  4.02099599e-07,   4.41729377e-07,   4.33480302e-08,
         7.43497138e-06,   1.28446819e-05,   4.27614385e-07,
         1.34106753e-05])

同样,对于您的“行加总”部分,…

In [70]: def rand_rows_sum_to_one(nrows, ncols):
   ....:     x = np.random.random((ncols, nrows))
   ....:     y = x.sum(axis=0)
   ....:     x /= y
   ....:     return x.T
   ....:

In [71]: %timeit rand_rows_sum_to_one(1000000, 13)
1 loops, best of 3: 455 ms per loop

In [72]: x = rand_rows_sum_to_one(1000000, 13)

In [73]: x.sum(axis=1)
Out[73]: array([ 1.,  1.,  1., ...,  1.,  1.,  1.])

老实说,即使您重新实现C语言中的功能,但我不确定您在这方面是否能胜过numpy …不过,我可能错了!

2020-12-20