@nishe

Насколько эффективен мой код, если я для изменения key-value хранилища каждый раз полностью считываю его?

Я создал консольный скрипт, для работы с key-value хранилищем. Для того чтобы считать из него какое-то значение по ключу или добавить новое значение, я считываю его каждый раз его полностью. Это нормальная практика или стоит поступать иным образом?
Работает хранилище таким образом: при передаче --key --value создается значение для ключа(или добавляется, если ключ уже существует). При передаче --key выводятся значения ключа.
import os
import tempfile
import argparse
import json

import os
import tempfile

parser = argparse.ArgumentParser()
parser.add_argument('--key')
parser.add_argument('--value')
parser_args = parser.parse_args()
storage_path = os.path.join(tempfile.gettempdir(), 'storage.data')

try:
    with open(storage_path, 'r') as f:
        data = json.load(f)
except json.decoder.JSONDecodeError:
    data = {}
    with open(storage_path, 'w') as f:
        json.dump(data, f)
except FileNotFoundError:
    data = {}
    with open(storage_path, 'w') as f:
        json.dump(data, f)

if parser_args.value is None:
    with open(storage_path, 'r') as f:
        data = json.load(f)
        try:
            print(*data[parser_args.key], sep=', ')
        except KeyError:
            print(None)

if (parser_args.key is not None) and (parser_args.value is not None):
    with open(storage_path, 'r') as f:
        data_local = json.load(f)
    with open(storage_path, 'w') as f:
        try:
            data_local[parser_args.key].append(parser_args.value)
        except KeyError:
            data_local[parser_args.key] = [parser_args.value]
        json.dump(data_local, f, indent=4)

P.S как лучше писать: if smth is None или лучше писать if smth?
  • Вопрос задан
  • 83 просмотра
Решения вопроса 1
@deliro
Для того чтобы считать из него какое-то значение по ключу или добавить новое значение, я считываю его каждый раз его полностью. Это нормальная практика или стоит поступать иным образом?

Смотря что такое "норма". Если это штука просто на поиграться — нормально. Если в хранилище пара сотен ключей или меньше — нормально. Если нагрузок нет — нормально. Для реальных проектов — не нормально. Сложность каждой операции — O(n), не считая того, что открытие файлов — это тоже затратная операция. SQLite с одной таблицей и индексом на key в качестве key-value хранилища будет в разы быстрее.

P.S как лучше писать: if smth is None или лучше писать if smth?

Это две разных проверки. smth is None выдаст False, если smth равно 0 или пустому списку или другому falsy объекту. Я предпочитаю писать is None всегда, когда тип Optional[T], чтобы исключить случай, когда пришёл не-None, но falsy значение, иначе можно скрыть ошибку
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы