2014-11-17 113 views
0

我有RGB這些3個頂點(端值)作爲#ff0000#ffcfcf#350000其中R變化從35ffG00cfB00cf十六進制代碼的列表。我需要創建它們之間所有可能值的列表。我做了以下:創建的給定一個RGB範圍

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(不工作)。這種方法很慢。有一個更好的方法嗎?

回答

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似乎有點關閉對我來說,尤其是因爲Python有內置的字符串格式化用於這一目的:

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,我們甚至可以寫爲一個班輪(SANS長線突破和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秒。希望足夠快。

+0

太棒了,它的工作原理..最後一個應該實際上被分配給一個變量而不是返回,對嗎?你能解釋一下{0:02x}做什麼嗎? –

+1

@Swordy是的,謝謝,我已經改變了。之前的迴歸是因爲我將所有版本都作爲函數來進行基準測試。而「{0:02x}」是格式字符串。你可以閱讀更多關於他們[這裏](https://docs.python.org/2/library/string.html#format-string-syntax); [該頁面上的示例](https://docs.python.org/2/library/string.html#format-examples)對於新手對他們特別有用。基本上,它說:「採取格式方法的第一個參數(基於0)並將其打印爲十六進制數('x'),並將零置於前面,使其至少有2個字符長('02')。 「_ – Carsten