Python中字符串切片与索引操作的性能差异原因是什么
两段Python文件处理代码的效率差异原因
以下为两个版本的对比代码:
初始版本
for line in file: if line[0:2] == ".I": #do something elif line[0:2] == ".T": #do something else elif line[0:2] == ".A": ......
优化后版本
for line in file: if line[0] == ".": if line[1] == "I": #do something elif line[1] == "T": #do something elif line[1] == "A": ...
二者出现巨大性能差距的核心原因如下:
- 切片的额外对象开销
Python中的字符串是不可变对象,每次执行line[0:2]切片操作时,无论切片长度多小,都会生成一个全新的字符串对象,涉及内存申请、字符拷贝、引用计数管理等额外开销。初始版本中每个elif分支都会重新执行一次切片操作,匹配失败的次数越多,重复的切片开销累积越严重。优化版本直接通过索引读取单个字符,不会生成新对象,执行开销极低。 - 非目标行的提前终止
对于首字符不是.的非目标行,优化版本仅需要一次单字符判断就能跳过所有后续分支逻辑。但初始版本无论首字符是什么,都需要先完成切片、再执行双字符比较才能判定不匹配,浪费了大量计算资源。 - 单字符比较效率更高
单字符比较本质是对字符对应的编码整数做等值判断,执行速度远快于两个字符串的逐字符比较。即便所有行都是首字符为.的目标行,优化版本的分支匹配速度也远高于初始版本。
内容的提问来源于stack exchange,提问作者user1234
相关产品推荐
相关产品推荐

