python字符串高效拼接

衆所周知,爲了使字符串的使用如整形等基本類型一樣安全,無副作用,字符被限定爲不可變對象,也就是說絕大部分對字符串的修改操作將會創建新的字符串對象,而不是返回原字符串,這就容易造成不斷創建對象,申請內存的低效操作。在項目中,字符串拼接是一個高頻場景,下面就讓我們來看一看如何高效的拼接字符串。


方式一:通過 “ + ” 號拼接

不推薦

str1 = "a"
str2 = "b"
str3 = "c"

print( str1 + str2 + str3 )
>>>"abc"

使用這種方式進行字符串連接的操作效率低下,因爲python中使用 + 拼接兩個字符串時會生成一個新的字符串

上訴  str1+str2+str3  執行過程解析成

>>> str1 + str2 + str3

temp = str1 + str2
final = temp + str3

生成新的字符串就需要重新申請內存,當拼接字符串較多時自然會影響效率。

 

方式二:格式化% 或者 format

推薦

str1 = "a"
str2 = "b"
str3 = "%s%s" % (str1,str2)
str4 = "{}{}".format(str1,str2)

#下面是for循環拼接一個字符串時候的使用
content = u""
for i in range(20):
    content= u"{}{}".format(content,str(i))

這種方式不需要申請很多次內存,而是一次性完成,所以這種方法推薦首選


方式三:通過str.join()方法拼接

高效列表

list1 = ["1","2","3"]
str1 = "".join(list1)

# 注意:使用join的時候,列表裏面的每一項都必須是str類型
# 否則會出錯
# 比如:
list2  = ["1",2]
str2 = "".join(list2)
>>TypeError: sequence item 1: expected str instance, int found

 使用略微複雜,但對於多個字符串進行拼接時,效率很高,只會有一次內存的申請。所以很擅長對列表的處理。

 

方式四: template方式

format升級

from string import Template

 # ${} 設置變量佔位符
temp1 = Template("${s1} 11 ${s2} 22 ${s3}") 

str2 = temp1.safe_substitute(s1="hello",s2="world")
print(str2)  # hello 11 world 22 ${s3}

str3 = temp1.safe_substitute(s1="hello",s2="world",s3="i'am comming")
print(str3)  # hello 11 world 22 i'am comming

Template的實現方式是首先通過Template初始化一個字符串。這些字符串中包含了一個個key。通過調用substitute或safe_subsititute,將key值與方法中傳遞過來的參數對應上,從而實現在指定的位置導入字符串。

該效率是字符串格式化打印的進階版,因爲字符串打印 %、 {} 方式有可能會因爲數量不夠(佔位符與參數個數不一致)而報錯,如

from string import Template

s = Template('${s1} ${s2} ${s3}!') 
s.safe_substitute(s1='Hello',s2='World')
>>>'Hello World ${s3}!'

 

方式五: 通過F-strings拼接

F-strings效率最高

在python3.6.2版本中,PEP 498 提出一種新型字符串格式化機制,被稱爲“字符串插值”或者更常見的一種稱呼是F-strings,F-strings提供了一種明確且方便的方式將python表達式嵌入到字符串中來進行格式化:

s1 = 'Hello'
s2 = 'World'
f'{s1} {s2}!'
>>>'Hello World!'

在F-strings中我們也可以執行函數:

def power(x):
    return x*x
 
x = 5
f'{x} * {x} = {power(x)}'

>>> '5 * 5 = 25'

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章