我将RGB
的这3个顶点(结束值)设为#ff0000
,#ffcfcf
和#350000
,其中R
从35
变为ff
G
,00
从cf
到B
,00
从cf
到import re
my_list=[]
for i in xrange(53,256):
for j in xrange(0,208):
for k in xrange(0,208):
item = str(hex(i))+str(hex(j))+str(hex(k))
item2 = re.sub('(0x)','',item)
my_list.append(item2)
。我需要创建一个列表,列出它们之间的所有可能值。我做了以下事情:
RGB
我迭代整数值并将它们转换为十六进制,然后连接0x
值并从连接字符串中取代{{1}}(这不起作用)。这种方法很慢。有更好的方法吗?
答案 0 :(得分:4)
作为基准测试,我在计算机上运行了代码。它需要27.8秒。
正则表达式总是很昂贵,所以让我们通过简单的字符串替换替换它们:
my_list=[]
for i in xrange(53,256):
for j in xrange(0,208):
for k in xrange(0,208):
item = str(hex(i))+str(hex(j))+str(hex(k))
item2 = item.replace("0x", "")
my_list.append(item2)
这需要8.8秒。
但所有这些采用十六进制数字的字符串表示并删除它前面的0x
对我来说似乎有点 off ,特别是因为Python已经构建-in用于此目的的字符串格式:
my_list=[]
for i in xrange(53,256):
for j in xrange(0,208):
for k in xrange(0,208):
my_list.append("{0:02x}{1:02x}{2:02x}".format(i,j,k))
这需要8.3秒。稍微好一点,但它看起来也更清洁。如果我们使用itertools
,我们甚至可以将其写为单行(没有长行换行符和导入语句):
import itertools
my_list = ["{0:02x}{1:02x}{2:02x}".format(i,j,k) for i,j,k
in itertools.product(xrange(53,256), xrange(0,208), xrange(0,208))]
这需要8.1秒。还没有。
现在,字符串格式化是花费大部分时间的操作。这也是我们可以轻松避免的操作(因为我们只是格式化相同的256个值)。让我们创建一个查找表:
import itertools
m = ["{0:02x}".format(i) for i in xrange(256)]
my_list = [m[i] + m[j] + m[k] for i,j,k
in itertools.product(xrange(53,256), xrange(0,208), xrange(0,208))]
运行时间:1.6秒。希望足够快。