|
import argparse |
|
import json |
|
import logging |
|
from flask import Flask |
|
|
|
|
|
parser = argparse.ArgumentParser(description='Server to demonstrate latency') |
|
parser.add_argument('--dictionary', help='File with list of words', |
|
default='zdict_largo.dic') |
|
|
|
|
|
LIST_DIRECTORY = [] |
|
SET_DIRECTORY = set() |
|
|
|
|
|
def _binary_search(directory, start, end, word): |
|
spot = (start + end) // 2 |
|
if directory[spot] == word: |
|
return True |
|
elif spot == start: |
|
return False |
|
elif directory[spot] > word: |
|
return _binary_search(directory, start, spot, word) |
|
else: |
|
assert directory[spot] < word |
|
return _binary_search(directory, spot, end, word) |
|
|
|
|
|
def _list_search(directory: list, word): |
|
return word in directory |
|
|
|
|
|
def _hash_search(directory: set, word): |
|
return word in directory |
|
|
|
|
|
def _load_dicts(fname): |
|
logging.info('Loading directory from %s', fname) |
|
with open(fname, 'r') as f: |
|
for word in f: |
|
word = word.split('/')[0] |
|
word = word.strip() |
|
LIST_DIRECTORY.append(word) |
|
SET_DIRECTORY.add(word) |
|
|
|
LIST_DIRECTORY.sort() |
|
logging.info('Directory has %d/%d words. Sample:\n%s', |
|
len(LIST_DIRECTORY), len(SET_DIRECTORY), LIST_DIRECTORY[0:10]) |
|
|
|
|
|
app = Flask(__name__) |
|
|
|
@app.route("/binary/<word>") |
|
def serve_binary(word): |
|
return json.dumps({ |
|
'word': word, |
|
'found': _binary_search(LIST_DIRECTORY, 0, len(LIST_DIRECTORY) + 1, word)}) |
|
|
|
@app.route("/list/<word>") |
|
def serve_list(word): |
|
return json.dumps({ |
|
'word': word, |
|
'found': _list_search(LIST_DIRECTORY, word)}) |
|
|
|
@app.route("/hash/<word>") |
|
def serve_hash(word): |
|
return json.dumps({ |
|
'word': word, |
|
'found': _hash_search(SET_DIRECTORY, word)}) |
|
|
|
|
|
if __name__ == '__main__': |
|
logging.getLogger().setLevel('WARNING') |
|
logging.getLogger('werkzeug').setLevel('ERROR') |
|
args = parser.parse_args() |
|
_load_dicts(args.dictionary) |
|
app.run() |
|
|