我的代碼如下:
import re
def get_filename():
"""gets the file"""
filename = input("Please enter filename: ")
return filename
def get_words_from_file(filename):
"""getting the data and printing it word by word"""
infile = open(filename, 'r', encoding='utf-8')
outfile = infile.read().splitlines()
words = []
reading = False
for let in outfile:
if let.startswith("*** START OF")and reading == False:
reading = True
elif let.startswith("*** END OF SYNTHETIC TEST CASE ***") or let.startswith("*** END"):
return words
elif reading:
let = let.lower()
words.extend(re.findall("[a-z] [-'][a-z] |[a-z] [']?|[a-z] ", let))
return words
def calculate(words):
"""gjhwjghwg2"""
all_times = []
max_word_length = 0
number_of_words = len(words)
average = sum(len(word) for word in words) / number_of_words
for word in words:
if len(word)>max_word_length:
max_word_length=len(word)
for word in words:
total =words.count(word)
all_times.append(total)
max_frequency = max(all_times)
result = (number_of_words, average, max_word_length, max_frequency)
return result
def print_results(stats_tuple):
"""calculate the goods"""
(number_of_words, average, max_word_length, max_frequency) = stats_tuple
print("")
print("Word summary (all words):")
print(" Number of words = {0}".format(number_of_words))
print(" Average word length = {:.2f}".format(average))
print(" Maximum word length = {0}".format(max_word_length))
print(" Maximum frequency = {0}".format(max_frequency))
def main():
"""ghkghwgjkwhgw"""
filename = get_filename()
data = get_words_from_file(filename)
stats = calculate(data)
print_results(stats)
main()
我有一個非常大的文本檔案,所以當我嘗試運行它時,需要很長時間。只是想知道是否有什么我需要改變的,以便它不需要那么長時間。該代碼在其他地方運行良好,但該文本檔案有 75,000 個字。
uj5u.com熱心網友回復:
從我所看到的我會假設
for word in words:
total =words.count(word)
all_times.append(total)
是問題所在,因為它的運行時間是 O(len(words)**2)。把這個改成怎么樣
frequency = {word: 0 for word in words}
for word in words:
frequency[word] = 1
max_frequency = max(frequency.values())
注意:我沒有測驗此代碼。
uj5u.com熱心網友回復:
在get_words_from_file:
- 不要讀取整個檔案然后拆分行 - 只需遍歷行
- 編譯一次您的正則運算式模式并使用它
- 你真的需要那個
lower()電話嗎?
uj5u.com熱心網友回復:
您有一個包含 N 個單詞的文本檔案。您正在對其進行 5 次迭代
- get_words_from_file
- 平均值 = sum(len(word) for word in words) / number_of_words
3) for word in words:
if len(word)>max_word_length:
max_word_length=len(word)
4) for word in words:
total =words.count(word) # here is the fifth time
all_times.append(total)
總而言之,你的時間復雜度是 2N N^2;O(N^2)。
只進行兩次迭代可以節省大量時間。在單詞的第一次迭代中,制作一個字典,鍵=單詞值=出現次數
dict[str,int]
第二次迭代將計算所有其他度量。
在最壞的情況下(如果所有單詞都不同),時間復雜度將只有 2N。
大多數時候,由于所有單詞重復,它會快得多。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/483063.html
