2014-02-19 79 views
1

我正在嘗試編寫一個anagram服務。該方案的第一階段是要經過字的字典,並創建密鑰的Python字典的字長度和那些長度的字的值,即:醃製Python快速字典創建?

def processedDictionary(): 
    d = defaultdict(list) 
    f = open(dictionaryFile, "r") 
    f.close() 
    for line in lines: 
     length = len(line) 
     d[length].append(line) 
    return d 

這意味着字謎字只必須與相同長度的文字進行比較,其中processedDictionary()[length]可以加快腳本的速度。但是,我試圖更加優化腳本,因爲每次有人對字典進行字跡處理時都必須「處理」字典,這很愚蠢,因此我每次看字幕時都會加載已分類的字典:

def processedDictionary(): 
    file = open("dic.obj",'rb') 
    object_file = pickle.load(file) 
    file.close() 
    return object_file 

dic.obj是處理過的字典的2MB轉儲。然而,即使使用cPickle,pickle字典的加載速度也是原始腳本的兩倍左右!任何人都可以建議我在這裏丟失什麼,以及什麼是正確的路線來優化字典加載?

+0

你正在運行哪個python版本? – Torxed

+0

Python 2.7。對不起,總是忘記提及... – Laurence

+0

不用擔心,它與Pickle合作時特別重要:) – Torxed

回答

3

當你轉儲的數據,請確保您指定要使用的協議:

with open('dict.obj', 'wb') as fh: 
    pickle.dump(obj, fh, pickle.HIGHEST_PROTOCOL) 

當加載,你應該會看到一個速度increese如果切換到Python 3(如果可能)。

with open('dict.obj', 'rb') as fh: 
    return pickle.load(fh) 

另外還將醃漬文件存儲在單獨的介質上將被推薦。 由於從同一設備運行所有內容都會減慢讀取過程。

+0

謝謝Torxed。最高協議的速度要快得多,但仍然只是邊際改進。醃製:(實0m0.168s用戶\t 0m0.120s SYS \t 0m0.032s)原文:(實\t 0m0.175s用戶\t 0m0.140s SYS \t 0m0.024s) – Laurence

+0

你是說你的泡菜需要0.168秒完成?因爲如果這是你正在處理的邊緣部分..他們比較快。你必須考慮到它已經很快開始了,在這些級別上削減時間與Python一起工作是非常複雜的。如果你認爲在以「原始」格式閱讀字符串時必須對字符串進行更多計算,那麼你會注意到一個巨大的改進,那就是當醃菜對你有用時。如果你有1GB的數據,你會節省一分鐘左右,而1GB的數據也不多:) – Torxed

+0

謝謝。我懷疑這一點。我只是認爲,取出字典的時間與從頭開始創建經處理的Python字典的時間相同是很奇怪的。如果酸洗不能增加速度,它是否值得使用? – Laurence