Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
1 / 1 / 0
Регистрация: 11.01.2017
Сообщений: 28
1

Оптимизация кода

10.04.2018, 11:45. Показов 5256. Ответов 4

Author24 — интернет-сервис помощи студентам
Добрый день!
Решаю задачу по учебе и вроде код по условию верный, но при тестах выдает ошибку Runtime Error - там лимит ограничения в 5 секунд и возможно дело в этом. Помогите, пожалуйста, ускорить код. Может быть поможете заменить часть кода, ибо у меня голова уже не работает за 3 дня этой головоломки.

Условие:
Реализуйте программу, которая будет эмулировать работу с пространствами имен. Необходимо реализовать поддержку создания пространств имен и добавление в них переменных.

В данной задаче у каждого пространства имен есть уникальный текстовый идентификатор – его имя.

Вашей программе на вход подаются следующие запросы:

create <namespace> <parent> – создать новое пространство имен с именем <namespace> внутри пространства <parent>
add <namespace> <var> – добавить в пространство <namespace> переменную <var>
get <namespace> <var> – получить имя пространства, из которого будет взята переменная <var> при запросе из пространства <namespace>, или None, если такого пространства не существует

Один из примеров данных ввода-вывода:
Sample Input:

9
add global a
create foo global
add foo b
get foo a
get foo c
create bar foo
add bar a
get bar a
get bar b

Sample Output:

global
None
bar
foo


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
x = {'None' : ['global', set()]}
            
 
def add(x, namesp, arg):
    for k, v in x.items():
        if v[0] == namesp:
            tmp = k
            buf = v[1]
            break
    buf.add(arg)
    x[k] = [namesp, buf]    
 
 
def create(namesp, arg):
    return [namesp, set()]
 
 
def get(x, namesp, arg):
    if namesp == 'None':
        return
    for k, v in x.items():
        if v[0] == namesp:
            tmp = k
            if arg in v[1]:
                return namesp   
    return get(x, tmp, arg)
 
 
n = int(input())
for i in range(n):
    cmd, namesp, arg = input().split()
    if cmd == 'add':
        add(x, namesp, arg)
    elif cmd == 'create':
        x[arg] = create(namesp, arg)
    elif cmd == 'get':
        print(get(x, namesp, arg))
Заранее спасибо
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2018, 11:45
Ответы с готовыми решениями:

Оптимизация кода
Как сделать count для каждого значения? Ниже приведен код, но я хотел бы сделать count каждого...

Оптимизация кода
kol=0 N=int(input()) teach_list= for i in range(N): teach_list.append(input()) teach_list1...

Оптимизация кода
Задача G. Условие в .pdf файле. Если нужны тесты, напишите. with open('test\\01', 'r') as inp: ...

Оптимизация кода простого калькулятора
Доброго времени. Начал изучать вчера python. Сегодня решил написать простой калькулятор. Написал....

Фрактальное Броуновское движения ( оптимизация кода)
В общем у меня функция генерации фрактального броуновского движения. Делается все очень просто....

4
Эксперт Python
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,134
Записей в блоге: 6
10.04.2018, 15:57 2
Цитата Сообщение от Delictum Посмотреть сообщение
for k, v in x.items(): if v[0] == namesp: tmp = k buf = v[1] break
Не надо искать в словаре ключи перебором. Посмотрите работу со словарями в Питоне, самые основы.
1
Просто Лис
Эксперт Python
5759 / 3551 / 1063
Регистрация: 17.05.2012
Сообщений: 10,389
Записей в блоге: 9
10.04.2018, 16:31 3
Лучший ответ Сообщение было отмечено Delictum как решение

Решение

У тебя плохо сделан поиск, как уже заметили.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/python3
 
class Node(object):
    def __init__ (self, ns, parent=None):
        self.ns = ns
        self.parent = parent
        self.v = set()
 
 
class Tree(object):
    def __init__ (self):
        self.d = {'global': Node('global')}
 
    def create_ns(self, ns, parent):
        n = self.d[parent]
        self.d[ns] = Node(ns, n)
 
    def add_var(self, ns, var):
        n = self.d[ns]
        n.v.add(var)
 
    def find_var(self, ns, var):
        name = ns
        while True:
            n = self.d[name]
            if var in n.v:
                return n.ns
            if not n.parent:
                return None
            name = n.parent.ns
 
 
t = '''\
add global a
create foo global
add foo b
get foo a
get foo c
create bar foo
add bar a
get bar a
get bar b'''
 
tree = Tree()
 
for line in t.split('\n'):
    cmd, namesp, arg = line.split(' ')
    if cmd == 'create':
        tree.create_ns(namesp, arg)
    elif cmd == 'add':
        tree.add_var(namesp, arg)
    elif cmd == 'get':
        print(tree.find_var(namesp, arg))
2
1 / 1 / 0
Регистрация: 11.01.2017
Сообщений: 28
10.04.2018, 16:41  [ТС] 4
Большое спасибо) Проверил: по тестам всё прошло, а теперь буду разбираться в реализации.
0
Просто Лис
Эксперт Python
5759 / 3551 / 1063
Регистрация: 17.05.2012
Сообщений: 10,389
Записей в блоге: 9
10.04.2018, 16:45 5
Там строится дерево. Корень дерева - это узел с именем 'global', у него нет родителя. Когда создаются узлы, обязательно добавляются родители.

self.d - справочник для быстрого поиска. Можно сказать, что в нём содержатся "указатели" на все-все узлы.

В find_var мы сначала пытаемся найти в текущем узле, если не нашли, то двигаемся вверх по дереву (для этого мы храним указатель на родителя).
0
10.04.2018, 16:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2018, 16:45
Помогаю со студенческими работами здесь

Отфильтровать из array только значения, входящие в одну из groups. Оптимизация кода
#!/usr/bin/env python list_in = groups = def check_range(list_in, groups): result = for...

Оптимизация кода
Добрый день, прорешивая разные задачки, зачастую мне удавалось добиться результата, чтобы код...

Оптимизация кода
Имею 2 вопроса: 1) что можно улучшить в коде(в плане написания, читаемости и т.д.) 2) self.data,...

Оптимизация кода
Оптимизируйте пожалуйста эти коды: s = input() res = set() for i in range(len(s)): for j in...

Оптимизация кода
Коллеги, здравствуйте! Как можно оптимизировать код, долго что-то выполняется import math...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru