2013-12-19 54 views
3

我對Python相當陌生,在比較字符串時我有一個關於性能的問題。下面的兩個代碼似乎都能達到我想要的效果,但是有沒有什麼理由使用其中的一個代替另一個呢?在['item1','item2',...]與X =='item1',X =='item2',...比較字符串與Python:X?

選項1:

if first_column_header == 'author name' or first_column_header == 'author' or first_column_header == 'name': 

選項2:

if first_column_header in ['author name', 'author', 'name']: 
+0

嘗試使用[timeit(http://docs.python.org/2/library/timeit.html)模塊 –

回答

8

選項2絕對是短,更Python。它也可能會給你的代碼增加一些額外的開銷,因爲它會創建一個列表然後遍歷它。

這是一個權衡你必須通過使程序的可讀性接受,但恕我直言,這過小的開銷而煩惱所以我會選擇去2.

希望這有助於!

3

如果你有一個選擇很多,說了十幾,而速度是真的關鍵,然後用set。檢查成員資格是最快的,但由於被檢查的項目需要進行散列處理,所以會有一些開銷。提前定義該集合,以便每次執行if語句時都不會重新定義該集合。

first_column_names = {"author name", "author", "name"} 

# In Python before 2.7, you must use `set()` instead: 
first_column_names = set(("author name", "author", "name")) 

if first_column_header in first_column_names: 

但是,如果速度至關重要,那麼您在Python中爲它開頭寫什麼? :-)通常你會想要更可讀的東西。在這種情況下,這將是一個列表或元組。定義一個元組文字是稍快的話,可讀性都是平等的,我會走那條路:

if first_column_header in ("author name", "author", "name"): 
+0

+1上重新定義每次'執行if'聲明好一點。我還用評論中提出的'timeit'測量了兩個選項,他們都花費了太多時間**,所以我認爲這應該比可讀性更好。 –

1

我與保羅不同意的事實,選項1是更快。以下是DIS顯示了這兩個函數:

def t(): 
    if a == 'author name' or a == 'author' or a == 'name': 
     return True 
    return False 

def t2(): 
    if a in ['author name','author','name']: 
     return True 
    return False 

似乎被在第一種情況下加載了很多次,呼叫之前創建的選項清單2所示。

3   0 LOAD_GLOBAL    0 (a) 
       3 LOAD_CONST    1 ('author name') 
       6 COMPARE_OP    2 (==) 
       9 POP_JUMP_IF_TRUE  36 
      12 LOAD_GLOBAL    0 (a) 
      15 LOAD_CONST    2 ('author') 
      18 COMPARE_OP    2 (==) 
      21 POP_JUMP_IF_TRUE  36 
      24 LOAD_GLOBAL    0 (a) 
      27 LOAD_CONST    3 ('name') 
      30 COMPARE_OP    2 (==) 
      33 POP_JUMP_IF_FALSE  40 

    4  >> 36 LOAD_CONST    4 (True) 
      39 RETURN_VALUE   

    5  >> 40 LOAD_CONST    5 (False) 
      43 RETURN_VALUE   
    8   0 LOAD_GLOBAL    0 (a) 
       3 LOAD_CONST    4 (('author name', 'author', 'name')) 
       6 COMPARE_OP    6 (in) 
       9 POP_JUMP_IF_FALSE  16 

    9   12 LOAD_CONST    5 (True) 
      15 RETURN_VALUE   

10  >> 16 LOAD_CONST    6 (False) 
      19 RETURN_VALUE   
+1

我測量他們,很驚訝地發現他們的表現幾乎確切。但正如我所建議的那樣,花費很少的時間,它更多的是可讀性而不是速度。 –

相關問題