Python - 使用固定alpha生成随机颜色列表的最快方法

时间:2014-01-31 15:17:29

标签: python performance random numpy colors

因此,我希望在Python中生成大约3.32亿种颜色(带有4个值的元组 - r,g,b,a)的大型列表,但固定的alpha值为0.6。我还需要复制它下面一行中的每一种颜色(即我最终得到6.64亿行 - 只有3.32亿种不同的颜色。

我已经尝试并测试了很多方法,但迄今为止最快的结论是使用numpy来:

  1. 使用numpy random
  2. 创建一个长度为3.32亿的数组,每行包含3个随机浮点值
  3. 使用numpy tile创建第二个相同长度的数组,每行的值为[0,0,0,0.6]
  4. 将第一个数组中的值复制到第二个数组的每行的前3个值
  5. 使用numpy repeat函数将每一行重复到下面的新插入行上(将数组与上一行的重复行交错)
  6. 这个代码约需要。 574秒或10分钟,是:

    import time
    import numpy as np
    
    t1 = time.time()
    
    randomnos = np.random.random_sample((332000000, 3)) 
    trans = np.tile([0,0,0,0.6],(332000000, 1))
    trans[:,:-1] = randomnos
    colorarray = np.repeat(trans, 2, axis=0)
    
    t2 = time.time()
    
    totaltime = t2 - t1
    
    print "Time Taken = %f seconds" % totaltime
    

    现在由于我不需要在运行时生成随机数,我得出结论,我可以只运行一次这个代码并保存到文件(使用numpy save),然后使用numpy load函数在运行时读取文件,即使这个速度要快得多,但对我来说还是太慢了106秒或大约2分钟。

    我认为在运行时必须有更快的方法来生成随机颜色?

    所需的输出类似于:

    array = [[ 0.98112321  0.38567094  0.2430455   0.6       ]
     [ 0.98112321  0.38567094  0.2430455   0.6       ]
     [ 0.54728619  0.97823465  0.86675383  0.6       ]
     [ 0.54728619  0.97823465  0.86675383  0.6       ]
     ..., 
     [ 0.15047076  0.55844066  0.79842858  0.6       ]
     [ 0.15047076  0.55844066  0.79842858  0.6       ]
     [ 0.53637406  0.52150776  0.44890727  0.6       ]
     [ 0.53637406  0.52150776  0.44890727  0.6       ]]
    

1 个答案:

答案 0 :(得分:2)

我对你展示的代码感到有点困惑。你似乎是在以一种非常全面的方式做事,我可能会误解你想要的东西。

但是,据我所知,你想要:

import numpy as np

colorarray = np.random.random_sample((332000000, 4))
colorarray[:, -1] = 0.6
colorarray = np.vstack([colorarray, colorarray])

这对我来说需要大约30秒。

或者,如果你想尽可能地优化事物,你可以减少一两秒:

num = 332000000
colorarray = np.empty((2 * num, 4), dtype=float)
colorarray[:num, :3] = np.random.random_sample((num, 3))
colorarray[:num, -1] = 0.6
colorarray[num:] = colorarray[:num]

这需要约28秒。


编辑:我完全误解了你想做的事情。 (我的错,不是你的。你有一个很好的,独立的,可运行的例子。我只是读得不够密切!)

要“交错”值,我们可以使用简单的切片技巧。从更优化的示例开始:

num = 332000000
colorarray = np.empty((2 * num, 4), dtype=float)
colorarray[::2, :3] = np.random.random_sample((num, 3))
colorarray[::2, -1] = 0.6
colorarray[1::2] = colorarray[::2]

运行需要更长的时间(~42秒),但会提供您想要的值。

正如您最初使用的那样,

numpy.repeat实际上比分配给切片要快一些,在这种情况下。因此,我们可以通过以下方式将事情缩短到~34秒

colorarray = np.empty((num, 4), dtype=float)
colorarray[:, :3] = np.random.random_sample((num, 3))
colorarray[:, -1] = 0.6
colorarray = np.repeat(colorarray, 2, axis=0)

修改2

最后,我终于对原始代码进行了基准测试......实际上,它与我的最终版本的速度几乎相同。似乎我对你的例子“roundabout”的评论是完全偏离基础的!