2012-08-02 95 views
2

爲什麼textwrap.wrap()textwrap.fill()這麼慢?例如,要在我的筆記本電腦上包裝10000個字符的字符串需要近兩秒半的時間。爲什麼textwrap.wrap()和textwrap.fill()這麼慢?

$ python -m timeit -n 10 -s 's = "A" * 10000; import textwrap' 'textwrap.fill(s)' 
10 loops, best of 3: 2.41 sec per loop 

與此相比,該代碼改編自an answer to a related Stack Overflow question

#!/usr/bin/env python 
# simplewrap.py 
def fill(text, width=70): 
    return '\n'.join(text[i:i+width] for i in 
        range(0, len(text), width)) 

它包裝大小的文本訂單比textwrap快:

$ python -m timeit -n 10 -s 's = "A" * 10000; import simplewrap' 'simplewrap.fill(s)' 
10 loops, best of 3: 37.2 usec per loop 
+1

TextWrap包的話,大概用了很多非拉丁腳本支持,而你的簡單代碼將字符串分成70個長度的數組。 – hamstergene 2012-08-02 16:01:36

回答

6

textwrap確實不是什麼很多您更多的簡單,簡化的示例程序。它構建一個新的類,編譯一些正則表達式來處理各種空白等總結能字符組合等

它不是一個真正的公平的比較,特別是因爲(作爲hamstergene注)你方的程序 實際上不包文本。

7

對代碼進行剖析顯示時間被意圖將輸入拆分爲單詞的正則表達式佔用。一個簡化版本,展示相同的問題是:

import re 
s = "A" * 10000 
wordsep_re = re.compile(
    r'\w+[^\W]-' 
    ) 
wordsep_re.split(s) 

我相信Python使用遞歸回溯匹配正則表達式。我認爲最近發生的事情是python一直試圖匹配 - 並且失敗,因此不得不備份。

您可以使用:

textwrap.fill(s, break_on_hyphens = False) 

,你會發現真的很快。匹配連字符的正則表達式在文本沒有任何空格的情況下存在病態。

2

您正在測試特定的病理案例。一個單一的,不可中斷的字符串進行可怕的:每九個字符

~: python -m timeit -n 10 -s 's = "A"*10000; import textwrap' 'textwrap.fill(s)' 
10 loops, best of 3: 1.62 sec per loop 

不過1000字,用空格分隔,運行速度快300倍:

~: python -m timeit -n 10 -s 's = "AAAAAAAAA " * 1000; import textwrap' 'textwrap.fill(s)' 
10 loops, best of 3: 5.46 msec per loop