给定一个十六进制代码创建一个Rgb范围代码列表

2024-07-01 07:05:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有RGB的这3个顶点(结束值)分别为#ff0000#ffcfcf和{},其中R35到{},G从{}到{},而{}从{}到{}。我需要创建它们之间所有可能值的列表。我做了以下事情:

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(这不起作用)。这种方法很慢。有更好的方法吗?在


Tags: 方法inreformyrgbitemlist
1条回答
网友
1楼 · 发布于 2024-07-01 07:05:59

作为基准,我在我的电脑上运行了你的代码。它需要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,对我来说似乎有点不太对劲,尤其是Python为此内置了字符串格式:

^{pr2}$

这需要8.3秒。稍微好一点,但看起来也更干净一点。如果我们使用^{},我们甚至可以将其写成一行代码(sans long linebreak and import语句):

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秒。希望足够快。在

相关问题 更多 >

    热门问题