因此,我希望在Python中生成大约3.32亿种颜色(带有4个值的元组 - r,g,b,a)的大型列表,但固定的alpha值为0.6。我还需要复制它下面一行中的每一种颜色(即我最终得到6.64亿行 - 只有3.32亿种不同的颜色。
我已经尝试并测试了很多方法,但迄今为止最快的结论是使用numpy来:
这个代码约需要。 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 ]]
答案 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”的评论是完全偏离基础的!