Как оптимизировать код для вопроса конкурса по информатике?

#python

#python

Вопрос:

Я начинающий программист, готовящийся к олимпиаде по информатике, пытаясь решить некоторые из задач для начинающих, которые есть на их веб-сайте. Мой любимый код — python. Один вопрос, на котором я застрял, касается чтения входного файла, где в первой строке есть два целых числа, разделенных пробелом, представляющих количество записей в словаре (каждая запись имеет номер и его перевод (другое число) рядом с ним) и количество строк (после словарных записей) целых чисел. Я должен написать решение, которое преобразует эти целые числа. Для целых чисел без перевода используется ‘C?’.

Пример ввода

 5 6
2 71
3 556
140 19
87 555
71 3
140
2
87
2
3
4
  

Выходной пример

 19
71
555
71
556
C?
  

Моим первоначальным решением было искать каждое целое число, которое мне нужно было перевести, в словаре, а затем добавлять его перевод в выходной файл.

 input_file = open("dictin.txt", "r")
output_file = open("dictout.txt", "a")

input_file_list = input_file.readlines()
info = input_file_list[0].split()

dictionary = input_file_list[1:int(info[0])   1]
phrase = input_file_list[int(info[0])   1: len(input_file_list)]

for word in phrase:
    key_num = 0
    word_exists = False
    for key in dictionary:
        if int(key.split()[0]) == int(word):
            output_file.write(key.split()[1]   "n")
            word_exists = True
            break
        else:
            key_num  = 1
    if not word_exists:
        output_file.write("C?n")
        word_exists = False

input_file.close()
output_file.close()
  

Хотя это решение действительно работает, оно не соответствует ограничению по времени в 1 секунду, требуемому для решения проблемы, что означает, что оно слишком неэффективно. Однако я не уверен, как заставить его работать быстрее. Я пытался найти лучший способ определить, существует ли слово в словаре, в первую очередь, но это не работает из-за того, как я анализирую файл. Возможно ли какой-нибудь синтаксис или, возможно, модуль, который я мог бы импортировать (при необходимости). Помощь очень ценится.

Комментарии:

1. Проблема кодирования — отвлекающий маневр, ИМХО. В любом случае, оптимизация требует измерения улучшений, поэтому настройте эталон. Кроме того, если вы не знаете, где вы проводите сколько времени, вы можете только догадываться, какой код улучшить. Наконец, ненужное повторение — это убийца времени.

Ответ №1:

Прежде всего, вы постоянно взаимодействуете со своими входными данными в виде строк, преобразуя их в int каждый раз, когда обращаетесь к ним. Это огромная трата времени. Вместо этого, как предполагает проблема, создайте словарь (Python dict ) из входных данных. Если это для вас ново, тогда поработайте с руководством по dicts — Stack Overflow — это не то место, где нужно повторять существующие руководства.

Вы теряете время, перебирая dict, просто чтобы найти ключ. Вы можете прервать этот цикл. Преобразовать word в int , затем

 if word in dict:
  

Еще лучше, вы должны использовать get для поиска с резервным значением:

 out_val = my_dict.get(word, 'C')
  

Затем вы записываете out_val в выходной файл.