我試圖加快我的應用程序,並且我發現下面的簡單小函數(compute_ave_freq)實際上是最大的時間豬之一。罪魁禍首似乎是在取消NLTK FreqDist的時候;它需要花費大量的時間。更快的方式來存儲一個NLTK FreqDict?
當然,即使是這樣低的時間量也不到新計算FreqDist所需時間的一半。有沒有更好的方法來保存NLTK FreqDist對象?我嘗試將它序列化爲JSON,但將它保存爲簡單字典,失去了我需要的許多NLTK功能。
下面的代碼:
def compute_ave_freq(word_forms):
fd = pickle.load(open("data/fd.txt", 'rb'))
total_freq = 0
for form in word_forms:
freq = fd.freq(form)
total_freq += freq
try:
ave_freq = total_freq/len(word_forms)
except ZeroDivisionError:
ave_freq = 0
return ave_freq
而這裏的LineProfiler輸出:
Total time: 0.197121 s
File: /home/username/development/appname/filename.py
Function: compute_ave_freq at line 25
Line # Hits Time Per Hit % Time Line Contents
==============================================================
25 def compute_ave_freq(word_forms, debug=False):
26 # word_forms is a list of morphological variations of a word, such as
27 # ['كتبوا', 'كتبو', 'كتبنا', 'كتبت']
28
29 1 78580 78580.0 79.1 fd = pickle.load(open("data/fd.txt", 'rb'))
30 1 3 3.0 0.0 total_freq = 0
31 5 10 2.0 0.0 for form in word_forms:
32 4 20676 5169.0 20.8 freq = fd.freq(form)
33 4 9 2.2 0.0 if debug==True:
34 print(form, '\n', freq)
35 4 6 1.5 0.0 total_freq += freq
36 1 1 1.0 0.0 try:
37 1 3 3.0 0.0 ave_freq = total_freq/len(word_forms)
38 except ZeroDivisionError:
39 ave_freq = 0
40 1 1 1.0 0.0 return ave_freq
謝謝!
取儲存加載到RAM中,這是一個相當困難的問題來處理,但一旦它的加載它的罰款。可能將其放入某個數據庫(例如SQL/Mongo)將是使用更大數據集的更好方法。否則,只需稍等片刻即可加載到RAM中。 – alvas
我認爲一般的規則可以是「如果你有一個數據集可以完全加載到RAM上,而且沒有太大的壓力,那麼在索引/查詢數據庫上節省的時間並不是很大,節省的時間可能不是很多」。 – alvas
在函數外部移動'fd = pickle.load(open(「data/fd.txt」,'rb'))''並且只要'fd'改變就傳遞給函數,即'def compute_ave_freq(word_forms,fd) :'。不管怎樣,如果'fd'沒有改變,只需將'fd'設爲一個全局變量並加載一次即可。 – alvas