Python-使用固定alpha生成随机颜色列表的最快方法
因此,我希望在Python中生成一个包含大约3.32亿种颜色的大型列表(具有4个值的元组-r、g、b、a),但alpha值固定为0.6。我还需要复制它下面一行中的每种颜色(即,我最终有6.64亿行-只有3.32亿种不同的颜色) 我尝试并测试了许多方法,但得出的结论是,到目前为止,最快的方法是使用numpy: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] 将第一个数组中的值复制
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秒相似。