建議大家不要直接相加字串
以前我還挺相信的 (但我本身還是懶沒有實際使用)
直到今天看到有cStringIO宣稱比StringIO還要好
為了想知道好多少就好奇來測試一下
連加次數:1000000
疊加字串: 'Hello World!'*10
測試流程:
- 清空所有變數
- 等待1秒
- 宣告相關變數/物件
- 字串相加n次為S
- 指定變數P為字串S
- 印出P長度
測試項目:
- List Append:
作法:用list將字串相加,最後用join成一個字串 - cStringIO:
作法:宣告為務件後,用write將字串寫入,最後getvalue()取出字串 - StringIO:
作法:同第2項 - Operator +:
使用最原始的字串相加 (+=)
測試結果:
- 0.1178 秒
- 0.3473 秒
- 1.0538 秒
- 0.1767 秒
結論:
又讓我跌破眼鏡,話說cStringIO也沒有多快,其實string相加就已經夠快了,實在不明白為什麼要用StringIO或是cStringIO, 不管測試幾次還是更改測試方法都是大同小異,而且將字串相加量增加愈多,之間差異愈大,不知道有沒有人知道中間問題在哪裡?還是說Python早就把Operator操作全部都用C來處理,所以效能根本不用擔心?不過敢肯定的是,用list將字串加起來再展開,果然是神之速。
實際應用:
之前有同事將所有item相加串成mysql,結果總共花三分鐘。後來我將string全部用list串起來在append結果只花5秒完成。現在回想起來,最主要所花的時間並不是在相加而是用.format (字串格式正規化) 因此處理流程被大幅增加,用append之後將正規化挪到最後才讓速度有如此明顯的差距。
2016/3/2 補充:
有學過比較進階程式語言課程應該會比較清楚,operator +會消耗3倍的記憶體,一旦記憶體吃完後效率差距會掉到數千倍,因此operator +不適合長字串相接。
2016/3/2 補充:
有學過比較進階程式語言課程應該會比較清楚,operator +會消耗3倍的記憶體,一旦記憶體吃完後效率差距會掉到數千倍,因此operator +不適合長字串相接。
沒有留言:
張貼留言