Нужен совет по улучшению производительности моего кода.
У меня есть два файла (Keyword.txt, description.txt). Keyword.txt состоит из списка ключевых слов (11 000+, если быть точным), а descriptions.txt состоит из очень больших текстовых описаний (9 000+).
Я пытаюсь читать ключевые слова из keyword.txt по одному и проверять, существует ли ключевое слово в описании. Если ключевое слово существует, я записываю его в новый файл. Так что это похоже на отношение многие-ко-многим (11 000 * 9 000).
Примеры ключевых слов:
Xerox
VMWARE CLOUD
Описание образца (оно огромное):
Planning and implementing entire IT Infrastructure. Cyberoam firewall implementation and administration in head office and branch office. Report generation and analysis. Including band width conception, internet traffic and application performance. Windows 2003/2008 Server Domain controller implementation and managing. VERITAS Backup for Clients backup, Daily backup of applications and database. Verify the backed up database for data integrity. Send backup tapes to remote location for safe storage Installing and configuring various network devices; Routers, Modems, Access Points, Wireless ADSL+ modems / Routers Monitoring, managing & optimizing Network. Maintaining Network Infrastructure for various clients. Creating Users and maintaining the Linux Proxy servers for clients. Trouble shooting, diagnosing, isolating & resolving Windows / Network Problems. Configuring CCTV camera, Biometrics attendance machine, Access Control System Kaspersky Internet Security / ESET NOD32
Ниже приведен код, который я написал:
import csv
import nltk
import re
wr = open(OUTPUTFILENAME,'w')
def match():
c = 0
ft = open('DESCRIPTION.TXT','r')
ky2 = open('KEYWORD.TXT','r')
reader = csv.reader(ft)
keywords = []
keyword_reader2 = csv.reader(ky2)
for x in keyword_reader2: # Storing all the keywords to a list
keywords.append(x[1].lower())
string = ' '
c = 0
for row in reader:
sentence = row[1].lower()
id = row[0]
for word in keywords:
if re.search(r'\b{}\b'.format(re.escape(word.lower())),sentence):
string = string + id+'$'+word.lower()+'$'+sentence+ '\n'
c = c + 1
if c > 5000: # I am writing 5000 lines at a time.
print("Batch printed")
c = 0
wr.write(string)
string = ' '
wr.write(string)
ky2.close()
ft.close()
wr.close()
match()
Теперь этот код занимает около 120 минут. Я попробовал несколько способов улучшить скорость.
- Сначала я писал по одной строке, затем я изменил его на 5000 строк за раз, так как это небольшой файл, и я могу позволить себе разместить все в памяти. Особого улучшения не увидел.
- Я отправил все на стандартный вывод и использовал конвейер из консоли, чтобы добавить все в файл. Это было еще медленнее.
Я хочу знать, есть ли лучший способ сделать это, так как я мог сделать что-то не так в коде.
Характеристики моего ПК: Оперативная память: 15 ГБ Процессор: i7 4-го поколения
if word in sentence:
- person Nir Alfasi   schedule 19.02.2015data = mmap.mmap(f.fileno(), size, access=mmap.ACCESS_READ)
могу ли я перебирать данные построчно? - person Siddarth   schedule 19.02.2015for line in
, я думаю;). Также поддерживаютсяSeek
, нотация нарезки и т. д.... - person ljetibo   schedule 19.02.2015