2014-01-28 15 views
-1

有没有检查是否['a','b','c'] == ['a','b','c']'abc' =='abc'之间有什么区别?什么是更有效的蟒蛇 - 比较列表或字符串?

我不指望那里有,但想要仔细检查。

+1

你为什么会关注这个......任何区别可能是微不足道的......字符串比较可能会更快一点......但是严重的是为什么它很重要? (我的意思是,你运行成正影响你的程序的执行速度变慢?) –

+4

字符串 - 因为这是一个“原始”操作(即,虽然两者都可以作为序列比较,从内部函数的字符串好处查看)。但是使用最合适的结构。 – user2864740

+0

仅仅是好奇心。 –

回答

2

下面是使用timeit.timeit比较两种方法的速度一时间测试:

>>> from timeit import timeit 
>>> list1 = ['a','b','c'] 
>>> list2 = ['x','y','z'] 
>>> timeit("list1 == list2", "from __main__ import list1, list2") 
0.31944255484984296 
>>> str1 = "abc" 
>>> str2 = "xyz" 
>>> timeit("str1 == str2", "from __main__ import str1, str2") 
0.2439259738318924 
>>> 

正如你所看到的,比较两个字符串的比较比两个列表有所加快。为什么,请参阅@ user2864740的comment。 :)

+0

谢谢你,iCodez和user2864740。一旦期限过去 –

+1

一个问题与测试,但会接受这样的回答:这是可能的(很可能)'str1'和'str2'指同一实习'str'对象,这样一个平等的考验将是非常快:任何物体应该与自身相等。 – chepner

+1

@chepner - 我改变了'str2'的值来补偿。 – iCodez

1

看来,串优势随着序列变得更大:

from timeit import timeit 

for p in range(4): 
    N = 10 ** p 
    list1 = list(range(10)) * N 
    list2 = list(list1) 
    list2[-1] = 0 
    str1 = ''.join(map(str, list1)) 
    str2 = ''.join(map(str, list2)) 

    # Sequences are equal except for their last element. 
    # And everything is the same length. 
    assert list1[:-1] == list2[:-1] 
    assert str1[:-1] == str2[:-1] 
    assert list1  != list2 
    assert str1  != str2 
    assert len(list1) == len(list2) 
    assert len(str1) == len(str2) 
    assert len(list1) == len(str1) 

    a = timeit("list1 == list2", "from __main__ import list1, list2") 
    b = timeit("str1 == str2", "from __main__ import str1, str2") 
    print 'Length:', N * 10 
    print ' list: ', a 
    print ' str: ', b 
    print ' ratio: ', a/b 

的一些结果:

Length: 10 
    list: 0.0885802666801 
    str: 0.0493016279308 
    ratio: 1.79670064454 
Length: 100 
    list: 0.33228903865 
    str: 0.0540730467332 
    ratio: 6.14518801372 
Length: 1000 
    list: 2.78192754261 
    str: 0.122594386356 
    ratio: 22.6921282882 
Length: 10000 
    list: 26.8981546711 
    str: 0.78435279802 
    ratio: 34.2934387931 
+0

非常令人印象深刻:)谢谢!书签代码,如果我需要测试更多的东西。 –