2016-03-03 69 views
2

Python3中,有一種更快的方法來檢查元素集合中是否存在元素,而不是使用字典進行嘗試嗎?Python3快速的方法來檢查元素集合中的元素

我計時以下和嘗試,除了是非常快速的循環通過一個數組,有沒有更好的方式去做這個沒有使用try/except

import timing 

bad_extensions_array = ['.png', '.gif', 
       '.map', '.jpg', '.ico', '.gzip', '.idx', 
       '.pack', '.eot', '.ttf', '.woff', '.zip', 
       '.pfx', '.woff2', '.o', '.node', '.gz', 
       '.icns', '.tgz', '.dll', '.js', '.nib', 
       '.PNG', '.exe', '.strings', '.xlsx', '.xls', 
       '.phar', '.xcf', '.foo', '.bmp', '.ser', 
       '.otf', '.gnumeric', '.ods', '.xml', '.graffle', 
       '.pdf'] 

bad_extensions_dict = { 
    '.png':True, '.gif':True, 
    '.map':True, '.jpg':True, '.ico':True, '.gzip':True, '.idx':True, 
    '.pack':True, '.eot':True, '.ttf':True, '.woff':True, '.zip':True, 
    '.pfx':True, '.woff2':True, '.o':True, '.node':True, '.gz':True, 
    '.icns':True, '.tgz':True, '.dll':True, '.js':True, '.nib':True, 
    '.PNG':True, '.exe':True, '.strings':True, '.xlsx':True, '.xls':True, 
    '.phar':True, '.xcf':True, '.foo':True, '.bmp':True, '.ser':True, 
    '.otf':True, '.gnumeric':True, '.ods':True, '.xml':True, '.graffle':True, 
    '.pdf':True 
} 

ext_ = 'sdsd' 

# ext_ not found 
# 0:00:00.110999 

# ext_ first in array 
# 0:00:00.018037 

def check_list(): 
    if ext_ in bad_extensions_array: 
     return True 
    return False 

# ext_ not found 
# 0:00:00.043047 

# ext_ found 
# 0:00:00.018655 

def check_dict(): 
    try: 
     return bad_extensions_dict[ext_] 
    except: 
     return False 

for x in range(100000): 
    #check_list() 
    #check_dict 
+5

'in'也可以作用於字典。但是如果你只關心按鍵而不是數值,那麼考慮使用一套。 – Kevin

+0

如果密鑰不存在,雖然我不確定它是否更快,但您可以使用'.get(ext_,False)'返回False –

+0

nope'dict.get'始終比較慢,但'in'正常工作'dict'然後'set'(都比'list更快) –

回答

2

正如@Kevin所述,in也適用於字典。它實際上適用於任何標準集合(儘管str的定義略有不同)。

檢查字典時,您正在識別該密鑰是否存在。

由於還指出,如果bad_extensions僅代表你不應該使用擴展,一組將是最好的,因爲這樣的:

bad_extensions = { 
    'bmp', 'dll', 'eot', 'exe', 'foo', 'gif', 'gnumeric', 'graffle', 'gz', 
    'gzip', 'icns', 'ico', 'idx', 'jpg', 'js', 'map', 'nib', 'node', 'o', 
    'ods', 'otf', 'pack', 'pdf', 'pfx', 'phar', 'png', 'ser', 'strings', 
    'tgz', 'ttf', 'woff', 'woff2', 'xcf', 'xls', 'xlsx', 'xml', 'zip' 
} 
+0

哇,使用'in'與集合比嘗試快60倍,除了字典 – ClickThisNick

+0

@ClickThisNick我注意到你也有您的設置中的一些值僅在大小寫方面有所不同。考慮讓'bad_extensions'中的每個項都是小寫,並用'bad_extensions'中的'extension.lower()'進行檢查。 – Kupiakos

+0

經測試,案件和.lower幾乎兩倍緩慢,在這種情況下進出口交易的準確性的速度。另外我不需要檢查擴展名中的'.'。這將使它更快* – ClickThisNick

相關問題