2014年11月5日 星期三

[python] String串接效能測試

因為很多人都說StringIO效能比較好

建議大家不要直接相加字串

以前我還挺相信的 (但我本身還是懶沒有實際使用)

直到今天看到有cStringIO宣稱比StringIO還要好

為了想知道好多少就好奇來測試一下



連加次數:1000000
疊加字串: 'Hello World!'*10
測試流程:

  1. 清空所有變數
  2. 等待1秒
  3. 宣告相關變數/物件
  4. 字串相加n次為S
  5. 指定變數P為字串S
  6. 印出P長度

測試項目:

  1. List Append:
    作法:用list將字串相加,最後用join成一個字串
  2. cStringIO:
    作法:宣告為務件後,用write將字串寫入,最後getvalue()取出字串
  3. StringIO:
    作法:同第2項
  4. Operator +:
    使用最原始的字串相加 (+=)
測試結果:
  1. 0.1178 秒
  2. 0.3473 秒
  3. 1.0538 秒
  4. 0.1767 秒
結論:

   又讓我跌破眼鏡,話說cStringIO也沒有多快,其實string相加就已經夠快了,實在不明白為什麼要用StringIO或是cStringIO, 不管測試幾次還是更改測試方法都是大同小異,而且將字串相加量增加愈多,之間差異愈大,不知道有沒有人知道中間問題在哪裡?還是說Python早就把Operator操作全部都用C來處理,所以效能根本不用擔心?不過敢肯定的是,用list將字串加起來再展開,果然是神之速。

實際應用:
    之前有同事將所有item相加串成mysql,結果總共花三分鐘。後來我將string全部用list串起來在append結果只花5秒完成。現在回想起來,最主要所花的時間並不是在相加而是用.format (字串格式正規化) 因此處理流程被大幅增加,用append之後將正規化挪到最後才讓速度有如此明顯的差距。

2016/3/2 補充:
有學過比較進階程式語言課程應該會比較清楚,operator +會消耗3倍的記憶體,一旦記憶體吃完後效率差距會掉到數千倍,因此operator +不適合長字串相接。

沒有留言:

張貼留言