【发布时间】:2014-02-24 08:21:40
【问题描述】:
因此,我希望在 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 ]]
【问题讨论】:
-
如果你想从文件中读取:试试
pickle或cpickle。或者使用像 sqlite 这样的小型数据库。 -
感谢您的回答,我尝试过 pickle 和 numpy 加载速度更快(颜色以二进制格式保存),即使是 sql 数据库检索这么多行的速度也很慢,所以我没有认为它会更快,理想情况下,由于额外的开销,我不想将其存储在数据库中。
-
您的颜色可以容纳多少位 rgb?只有 16,777,216 种 24 位颜色,因此枚举可能会更快。
标签: python performance random numpy colors