私の最初の本能は、名前をキーとして持つ辞書を作成することでした。辞書内のキーのハッシュを使用して名前を検索するのが最も効率的であると想定しました。
答えが与えられたので、@ rfwによって、名前のaを使用して、以下のようにコードを編集し、名前のaと。set
を使用して2つのメソッドに対してテストしました。dict
set
4,000万を超えるレコードと5400を超える名前のダミーデータセットを作成しました。このデータセットを使用すると、setメソッドは一貫して私のマシンで優位に立っていました。
import re
from collections import Counter
import time
# names file downloaded from http://www.tucows.com/preview/520007
# the set contains over 5400 names
f = open('./names.txt', 'r')
names = [ name.rstrip() for name in f.read().split(',') ]
name_set = set(names) # set of unique names
names_dict = Counter(names) # Counter ~= dict of names with counts
# Expect: 246 lalala name="Jack";surname="Smith"
pattern = re.compile(r'.*\sname="([^"]*)"')
def select_rows_set():
f = open('./data.txt', 'r')
out_f = open('./data_out_set.txt', 'a')
for record in f.readlines():
name = pattern.match(record).groups()[0]
if name in name_set:
out_f.write(record)
out_f.close()
f.close()
def select_rows_dict():
f = open('./data.txt', 'r')
out_f = open('./data_out_dict.txt', 'a')
for record in f.readlines():
name = pattern.match(record).groups()[0]
if name in names_dict:
out_f.write(record)
out_f.close()
f.close()
if __name__ == '__main__':
# One round to time the use of name_set
t0 = time.time()
select_rows_set()
t1 = time.time()
time_for_set = t1-t0
print 'Total set: ', time_for_set
# One round to time the use of names_dict
t0 = time.time()
select_rows_dict()
t1 = time.time()
time_for_dict = t1-t0
print 'Total dict: ', time_for_dict
Counter
本質的に辞書であり、データセットからの構築が容易なaは、アクセス時間にオーバーヘッドを追加しないと想定しました。私が何かを逃しているならば、訂正されてうれしいです。