Skip to main content
 首页 » 编程设计

python之为什么列表元素替换比 python 中的字符串元素替换慢

2025年05月04日18over140

我正在尝试将数据结构中的一组元素替换为其他值。在 python 的情况下,在字符串中进行这种替换似乎比在列表中快得多(如下面的基准测试所揭示的)。谁能解释一下原因。

注意:这些测试是使用 python 2.7 执行的。

def string_replace_test(s, chars): 
    """Replaces a set of chars to 0""" 
    new = s 
    for c in chars: 
        new = new.replace(c, '0') 
    return new 
 
def list_replace_test(s, chars): 
    """Replaces a set of chars to 0""" 
    for a in xrange(len(s)): 
        if s[a] in chars: 
            s[a] = '0' 
 
if __name__ == '__main__': 
    import timeit 
    s = """ 
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec 
        etfringilla purus. Pellentesque bibendum urna at neque consectetur 
        at tincidunt nulla luctus. Pellentesque augue lacus, interdum id 
        lectus vitae, laoreet suscipit arcu. 
        """ 
    s2 = list(s) 
    chars = ['a', 'e', 'i', 'o', 'u'] 
    print(timeit.timeit("string_replace_test(s, chars)", setup="from __main__ import string_replace_test, s, chars")) 
    print(timeit.timeit("list_replace_test(s2, chars)", setup="from __main__ import list_replace_test, s2, chars")) 

输出:

5.09572291374 
49.3243050575 

使用范围():

5.01253795624 
53.2320859432 

请您参考如下方法:

由于没有 list.replace() 函数,您构建了自己的函数,但选择了一个缓慢的方法。

改用列表理解:

def list_replace_test(s, chars): 
    """Replaces a set of chars to 0""" 
    return [a if a not in chars else '0' for a in s] 

这仍然比字符串替换慢,因为您无法避免此处的 Python 循环。

为 chars 使用集合有助于:

chars = set(chars) 

但替换文本中单个 字符的最快方法实际上是完全不同的技术。使用 str.translate()为此:

from string import maketrans 
 
map = maketrans('aeiou', '0' * 5) 
def str_translate(s, map): 
    return s.translate(map) 

随着这些变化,时间变为:

>>> timeit.timeit("list_replace_test(s2, chars)", setup="from __main__ import list_replace_test, s2, chars") 
28.60542392730713 
>>> timeit.timeit("string_replace_test(s, chars)", setup="from __main__ import string_replace_test, s, chars") 
4.002871990203857 
>>> timeit.timeit("str_translate(s, map)", setup="from __main__ import str_translate, s, map") 
0.7250571250915527 

也将循环的 str.replace() 调用从水中吹出。