繁体   English   中英

在字符串中交换字符的最快方法(Python)

[英]Fastest way to swap characters in a string (Python)

我已经看到了很多关于执行某些事情的最有效方法的问题,但是我没有看到的一个问题(一个很有帮助的问题)是在字符串中交换两个字符的最有效方法。 当我想到它时,我立即将其转换为列表,交换元素,然后将其加入:

def swap(s: str, index1: int, index2: int) -> str:
    new_s = list(s)
    new_s[index1], new_s[index2] = new_s[index2], new_s[index1]
    return "".join(new_s)

但是,我想知道是否有更好的方法。 我尝试使用以下方式进行列表切片:

def swap(s: str, index1: int, index2: int) -> str:
    lindex = min(index1, index2)
    gindex = max(index1, index2)
    return s[:lindex] + s[gindex] + s[lindex + 1:gindex] + s[lindex] + s[gindex + 1:]

但是,它似乎要慢得多,比第一种方法慢了整整 45%。 有没有人对此有更好(阅读:更有效)的解决方案? 或者最有效的方法是将其转换为列表?

您在 function 调用minmax上浪费时间。 您可以将 function 重写为:

def swap(s: str, index1: int, index2: int) -> str:
    lindex, gindex = (index1, index2) if index1 < index2 else (index2, index1)
    return s[:lindex] + s[gindex] + s[lindex + 1:gindex] + s[lindex] + s[gindex + 1:]

甚至对于小字符串,它也比基于列表的方法性能更高。

事实上,随着字符串变大,基于列表的方法比直接使用字符串要慢得多。 例如,使用这个timeit设置

from timeit import timeit

timeit(setup='''
import random
s = "abcdefghijklmnopqrstuvxyz" * 100
num = 1000000
indexes = [random.choices(range(len(s)), k=2) for _ in range(num)]
def swap(s: str, index1: int, index2: int) -> str:
    new_s = list(s)
    new_s[index1], new_s[index2] = new_s[index2], new_s[index1]
    return "".join(new_s)
''',
stmt='for i in range(num): swap(s, *indexes[i])',
number=1
)

基于字符串的函数比基于列表的 function 快大约 15 倍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM