gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:50:33 28 4
gpt4 key购买 nike

我正在尝试将数据结构中的一组元素替换为其他值。在 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() 调用从水中吹出。

关于python - 为什么列表元素替换比 python 中的字符串元素替换慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18416642/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com