比较字符串与Python:X在['item1','item2',...]与X =='item1',X =='item2',...?

时间:2013-12-19 21:15:36

标签: python string performance list comparison

我对Python很新,在比较字符串时我对性能有疑问。下面的两个代码似乎达到了我想要的但是有没有理由使用其中一个而不是另一个?

选项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']:

3 个答案:

答案 0 :(得分:8)

选项2肯定更短,更加pythonic。它也可能会为您的代码增加更多的开销,因为它会创建一个列表然后遍历它。

这是一个权衡,你必须通过使程序更具可读性来接受,但是,恕我直言,担心这个开销太少所以我会选择2。

希望这有帮助!

答案 1 :(得分: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"):

答案 2 :(得分:1)

我不得不同意保罗关于选项1更快的事实。以下是这两个函数的显示内容:

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

似乎在第一种情况下多次加载a,并且在调用之前创建了选项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