簡體   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