Python字符串通過'+'和join函數(shù)拼接新字符串的性能測試比較
有一道Python面試題, 以下代碼有什么局限性,要如何修改
def strTest(num): s = 'Hello' for i in range(num): s += 'x' return s
上面的代碼其實(shí)可以看出:由于變量str是不變對象,每次遍歷,Python都會生成新的str對象來存儲新的字符串,所以num越大,創(chuàng)建的str對象就越多,內(nèi)存消耗約大,速度越慢,性能越差。 如果要改變上面的問題,可以變字符串拼接為join聯(lián)合的方式,代碼如下:
def strTest2(num): s = 'Hello' l = list(s) for i in range(num): l.append('x') return ''.join(l)
下面兩種不同處理方式,運(yùn)行速度的比較:
>>> def strTest1(num): ... s = 'Hello' ... for i in range(num): ... s += 'x' ... return s >>> def strTest2(num): ... s = 'Hello' ... l = list(s) ... for i in range(num): ... l.append(s) ... return ''.join(l) >>> >>> from timeit import timeit # 運(yùn)行10萬級別數(shù)據(jù),運(yùn)行速度比對 >>> timeit("strTest1(100000)", setup="from __main__ import strTest1", number=1) 0.016680980406363233 >>> timeit("strTest2(100000)", setup="from __main__ import strTest2", number=1) 0.009688869110618725 # 運(yùn)行100萬級別數(shù)據(jù),運(yùn)行速度比對 >>> timeit("strTest1(1000000)", setup="from __main__ import strTest1", number=1) 0.14558920607187195 >>> timeit("strTest2(1000000)", setup="from __main__ import strTest2", number=1) 0.1335057276853462 # 運(yùn)行1000萬級別數(shù)據(jù),運(yùn)行速度比對 >>> timeit("strTest1(10000000)", setup="from __main__ import strTest1", number=1) 5.9497953107860475 >>> timeit("strTest2(10000000)", setup="from __main__ import strTest2", number=1) 1.3268972136649921 # 運(yùn)行2000萬級別數(shù)據(jù),運(yùn)行速度比對 >>> timeit("strTest1(20000000)", setup="from __main__ import strTest1", number=1) 21.661270140499056 >>> timeit("strTest2(20000000)", setup="from __main__ import strTest2", number=1) 2.6981786518920217 # 運(yùn)行3000萬級別數(shù)據(jù),運(yùn)行速度比對 >>> timeit("strTest1(30000000)", setup="from __main__ import strTest1", number=1) 49.858089123966295 >>> timeit("strTest2(30000000)", setup="from __main__ import strTest2", number=1) 4.285787770209481 # 運(yùn)行4000萬級別數(shù)據(jù),運(yùn)行速度比對 >>> timeit("strTest1(40000000)", setup="from __main__ import strTest1", number=1) 86.67876273457563 >>> timeit("strTest2(40000000)", setup="from __main__ import strTest2", number=1) 5.328653452047092 # 運(yùn)行5000萬級別數(shù)據(jù),運(yùn)行速度比對 >>> timeit("strTest1(50000000)", setup="from __main__ import strTest1", number=1) 130.59138063819023 >>> timeit("strTest2(50000000)", setup="from __main__ import strTest2", number=1) 6.8375931077291625 # 運(yùn)行6000萬級別數(shù)據(jù),運(yùn)行速度比對 >>> timeit("strTest1(60000000)", setup="from __main__ import strTest1", number=1) 188.28227241975003 >>> timeit("strTest2(60000000)", setup="from __main__ import strTest2", number=1) 8.080144489401846 # 運(yùn)行7000萬級別數(shù)據(jù),運(yùn)行速度比對 >>> timeit("strTest1(70000000)", setup="from __main__ import strTest1", number=1) 256.54383904350277 >>> timeit("strTest2(70000000)", setup="from __main__ import strTest2", number=1) 9.387400816458012 # 運(yùn)行8000萬級別數(shù)據(jù),運(yùn)行速度比對 >>> timeit("strTest1(80000000)", setup="from __main__ import strTest1", number=1) 333.7185806572388 >>> timeit("strTest2(80000000)", setup="from __main__ import strTest2", number=1) 10.946627677462857
從上面的比對數(shù)據(jù)可以看出,當(dāng)數(shù)據(jù)比較小的時候,兩者差別不大,當(dāng)數(shù)據(jù)越大,兩者性能差距就越大。從而可以看出,字符串拼接的方式一旦碰到大數(shù)據(jù)處理的時候,性能是非常慢的。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
- Python中join()函數(shù)多種操作代碼實(shí)例
- 詳解python路徑拼接os.path.join()函數(shù)的用法
- python3 字符串/列表/元組(str/list/tuple)相互轉(zhuǎn)換方法及join()函數(shù)的使用
- Python中.join()和os.path.join()兩個函數(shù)的用法詳解
- Python常見字符串操作函數(shù)小結(jié)【split()、join()、strip()】
- Python中threading模塊join函數(shù)用法實(shí)例分析
- 詳解Python中的join()函數(shù)的用法
- python多線程編程中的join函數(shù)使用心得
- Python join()函數(shù)原理及使用方法
相關(guān)文章
python實(shí)現(xiàn)全排列代碼(回溯、深度優(yōu)先搜索)
今天小編就為大家分享一篇python實(shí)現(xiàn)全排列代碼(回溯、深度優(yōu)先搜索),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02Python使用matplotlib.pyplot?as?plt繪圖圖層優(yōu)先級問題
這篇文章主要介紹了Python使用matplotlib.pyplot?as?plt繪圖圖層優(yōu)先級問題.文章圍繞主題展開詳細(xì)內(nèi)容需要的小伙伴可以參考一下2022-04-04Python處理文件的方法(mimetypes和chardet)
這篇文章主要介紹了Python處理文件的方法(mimetypes和chardet),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09用sqlalchemy構(gòu)建Django連接池的實(shí)例
今天小編就為大家分享一篇用sqlalchemy構(gòu)建Django連接池的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08python pandas 時間日期的處理實(shí)現(xiàn)
這篇文章主要介紹了python pandas 時間日期的處理實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python爬蟲實(shí)現(xiàn)vip電影下載的示例代碼
這篇文章主要介紹了Python爬蟲實(shí)現(xiàn)vip電影下載的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04使用Python合并PDF文件并添加自定義目錄及頁腳的全過程
在處理文檔時,我們經(jīng)常遇到需要合并多個PDF文件并添加目錄及頁腳的情況,本文將介紹如何使用Python,特別是PyPDF2和reportlab庫來實(shí)現(xiàn)這一功能我們將通過一個實(shí)用的示例來演示整個過程,需要的朋友可以參考下2024-03-03Python3使用PyQt5制作簡單的畫板/手寫板實(shí)例
下面小編就為大家?guī)硪黄狿ython3使用PyQt5制作簡單的畫板/手寫板實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10