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

Python-使用固定alpha生成随机颜色列表的最快方法,python,performance,random,numpy,colors,Python,Performance,Random,Numpy,Colors,因此,我希望在Python中生成一个包含大约3.32亿种颜色的大型列表(具有4个值的元组-r、g、b、a),但alpha值固定为0.6。我还需要复制它下面一行中的每种颜色(即,我最终有6.64亿行-只有3.32亿种不同的颜色) 我尝试并测试了许多方法,但得出的结论是,到目前为止,最快的方法是使用numpy: 使用numpy random创建一个长度为3.32亿的数组,每行包含3个随机浮点值 使用numpy tile创建第二个长度相同的数组,每行的值为[0,0,0,0.6] 将第一个数组中的值复制

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

我尝试并测试了许多方法,但得出的结论是,到目前为止,最快的方法是使用numpy:

  • 使用numpy random创建一个长度为3.32亿的数组,每行包含3个随机浮点值
  • 使用numpy tile创建第二个长度相同的数组,每行的值为[0,0,0,0.6]
  • 将第一个数组中的值复制到第二个数组每行的前3个值中
  • 使用numpy repeat函数将每一行重复到下面插入的新行上(将数组与前一行的重复项交错)
  • 此操作的代码大约需要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       ]]
    

    我对你展示的代码感到有点困惑。你似乎在以一种非常迂回的方式做事,我可能误解了你到底想要什么

    但是,据我所知,您希望:

    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


    在这一切结束时,我终于想到要对您的原始代码进行基准测试…它实际上与我的最终版本在速度上几乎相同。我对您的示例的评论似乎是“迂回的”完全不正确!

    如果您想从文件中读取:请尝试
    pickle
    cpickle
    。或者使用类似sqlite的小型数据库。感谢您的回答,我尝试了pickle,numpy加载速度更快(颜色以二进制格式保存)根据经验,即使是sql数据库检索这么多行也很慢,所以我认为它不会更快,理想情况下,由于额外的开销,我希望避免将其存储在数据库中。您的颜色可以容纳多少rgb位?只有16777216 24位颜色,因此枚举可能会更快。感谢您的帮助回答,我为您的优化解决方案计时,耗时106秒,因此它比从文件中读取要快。但没有更快的方法可以做到这一点吗?瓶颈在于生成随机值。如果您对非随机值(但可能是不同的值)满意,您可以使用其他一些选项(例如,使用内存中的任何内容初始化阵列,然后将其重新缩放到0-1范围)。稍后我将添加几个其他示例。此外,我刚刚检查了优化解决方案的输出,我想我已经把您对所需输出的理解弄糊涂了。在您的解决方案中,我似乎没有所需的重复行,我将编辑我的问题以添加所需输出的示例。@JamesElder-啊!您的代码现在更有意义了!我运行了它,但不知怎的错过了输出中的“交错”。是的,这也是一种有效的方法。只需一点,我将添加一个更新的示例。(至于机器,是的,它很快,但它可能更多地与内存速度有关,而不是CPU速度。)我还想说我在交错中重复了14次行,而不是2'colorarray=np.repeat(colorarray,14,axis=0)'(因为为了这个问题,我只是简化为2),这就是为什么我说574秒。只在代码中重复一次行所需的时间与您所说的34秒相似。