希望有人能幫到這裏嗎?我的代碼效率低下還是我的任務很難?
我已經寫了一些代碼來執行查找任務,並且需要很長時間才能完成 - 遠比看起來要長。出於保密原因,我無法描述確切的任務,但我可以給出一個直接類似的問題。
比方說,我有一個數據庫,其中包含一個單詞列表和一組與這些單詞相對應的值。說,顏色和多少這些顏色是喜歡的。
現在,我有一個文本,我想將本文中的所有單詞與我的顏色數據庫進行比較,如果匹配存在,我從數據庫中提取「喜歡」評分並記錄下來。當文本中的所有單詞與數據庫匹配(或不匹配)時,「喜歡」評分的總和就是我的輸出。
與我寫的代碼相當於下面的代碼,它對我給出的玩具示例很有用。但是,我的實際問題包含一個40k條目的數據庫,文本通常包含約500個單詞;文本中的大部分單詞都將在數據庫中。當我運行它時,需要數小時才能執行。我知道,將500個單詞與40k個條目的數據庫匹配意味着大約20m比較的數量級。 小時?
任何人都可以建議我是否在有限的硬件上做計算密集型問題,或者我的代碼只是大量低效?
謝謝!
import pandas as pd
import nltk as nltk
####### Creates toy data to test code on ###
colour = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet']
values = [1,2,3,4,5,6,7]
df1 = pd.DataFrame({'colour': ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet']})
df2 = pd.DataFrame({'value': [1,2,3,4,5,6,7]})
dfs = [df1, df2]
###### Code proper begins below
data = pd.concat(dfs, axis = 1) ######## Dataframe
#### Sample words
words = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet', 'cyan', 'white', 'black', 'pink', 'grey', 'scarlet']
#### Lists into which words are put post-analysis
rating = 0
rated = []
unrated = []
####### Code
for i in words:
for j in range(len(data['colour'])):
if i == data['colour'][j]:
rating = rating + data['value'][j]
rated.append(i)
break
elif i not in unrated and i not in data.values: ### Ensures each unrated word is entered only once.
unrated.append(i)
有效的解決方案將不會迭代。我建議尋找哈希樹或類似結構。無論大小如何,地圖查找都接近恆定時間是有原因的。 –
......這就是說:這是設計效率低下的問題,而不是實施問題。如果你想使用非常擅長這種工具的工具,可以考慮創建一個適當索引的SQL數據庫嗎?有些數據庫支持全文索引,這尤其適用於apropos。 –
夠公平的,儘管我現在還停留在Python中,所以SQL解決方案將無法工作。不過,我會研究哈希樹。 – Lodore66