Python如何对字符串执行类16位字节交换操作,现有方案是否最优?
你的现有实现功能正确,但不是最优方案,仍有不小的性能提升空间。
现有方案的性能缺陷
Python中字符串是不可变对象,你在while循环中每次用+拼接字符串,都会生成一个全新的字符串对象,当输入字符串长度较大时,会产生大量的临时对象,内存开销和时间损耗都会明显上升。
更优实现方案
按你后续会切换为列表输入的需求,分两种场景给出最优写法:
场景1:当前输入为连续长字符串
优先用列表推导式收集所有交换后的片段,最后一次性用join拼接,这是Python中字符串拼接性能最高的原生实现:
a = '34127895004211220001' b = ''.join([a[i+2:i+4] + a[i:i+2] for i in range(0, len(a), 4)]) print(b)
如果输入字符串长度超过10万字符,推荐用正则的底层C实现来处理,性能会比Python层循环高50%以上:
import re b = re.sub(r'(.)(.)(.)(.)', r'\3\4\1\2', a)
场景2:后续切换为列表输入(示例输入a = ['3412','7895','0042','1122','0001'])
直接对每个列表元素做切片交换即可,省去了列表拼接为长字符串的额外开销:
a = ['3412','7895','0042','1122','0001'] b = ''.join([s[2:] + s[:2] for s in a]) print(b)
性能对比参考
同等输入长度下:
- 基于
join的列表推导式实现,比你原有的while循环实现快30%以上,输入越长优势越明显 - 列表输入的直接处理方案,比先拼接为长字符串再处理的方案再快20%左右
内容的提问来源于stack exchange,提问作者Izalion
相关产品推荐
相关产品推荐

