Рубрики

Методы ввода Python для конкурентного программирования

Python — удивительно удобный язык с единственным недостатком — медленный. По сравнению с C, C ++ и Java он работает намного медленнее. На платформах онлайн-кодирования, если ограничение C / C ++ установлено на X. Обычно в Java время составляет 2X, а Python — 5X .

Чтобы повысить скорость выполнения кода для интенсивных задач ввода / вывода, языки имеют различные процедуры ввода и вывода.

Пример задачи:
Рассмотрим вопрос о поиске суммы N чисел, введенных пользователем.
Введите число N.
Введите N чисел, разделенных одним пробелом в строке.
Примеры:

Input : 
5
1 2 3 4 5
Output :
15

Различные решения Python для вышеуказанной проблемы:
Нормальный метод Python: (Python 2.7)
1. raw_input () принимает необязательный аргумент подсказки. Он также удаляет завершающий символ новой строки из возвращаемой строки.
2. print — это просто тонкая оболочка, которая форматирует входные данные (пробел между аргументами и символом новой строки в конце) и вызывает функцию записи для данного объекта.

# основной метод ввода вывода
# вход N

n = int(raw_input())

  
# введите массив

arr = [int(x) for x in raw_input().split()]

  
# инициализировать переменную

summation = 0

  
# рассчитать сумму

for x in arr:

    summation += x

      
# распечатать ответ

print(summation)

Немного более быстрый метод с использованием встроенного stdin, stdout: (Python 2.7)
1. sys.stdin, с другой стороны, является Файловым Объектом . Это похоже на создание любого другого файлового объекта, который можно создать для чтения входных данных из файла. В этом случае файл будет стандартным входным буфером.
2. stdout.write ('D / n') быстрее, чем печатать 'D' .
3. Еще быстрее написать все один раз с помощью stdout.write («». Join (list-compceptionsion)), но это делает использование памяти зависимым от размера ввода.

# импорт встроенного стандартного ввода вывода

from sys import stdin, stdout 

  
# предположим, что функция называется main () и
# все операции выполнены

def main():

  

    # ввод через метод readline

    n = stdin.readline()

  

    # массив ввода аналогичный метод

    arr = [int(x) for x in stdin.readline().split()]

  

    #initialize variable

    summation = 0

      

    # рассчитать сумму

    for x in arr:

        summation += x

  

    # может использовать встроенное суммирование = сумма (обр)

  

    # распечатать ответ через запись

    # метод write пишет только

    # строковые операции

    # поэтому нам нужно конвертировать любой

    # данные в строку для ввода

    stdout.write(str(summation))

  
# вызов основного метода

if __name__ == "__main__":

    main()    

Разница во времени:

Timing summary (100k lines each)
——————————–
Print : 6.040 s
Write to file : 0.122 s
Print with Stdout : 0.121 s

Добавление буферизованного канала io: (Python 2.7)
1. Просто добавьте буферизованный код ввода-вывода перед кодом отправки, чтобы ускорить вывод.
2. Преимущество объектов io.BytesIO состоит в том, что они реализуют общий интерфейс (обычно называемый «файловым» объектом). Объекты BytesIO имеют внутренний указатель, и для каждого вызова read (n) указатель продвигается.
3. Модуль atexit предоставляет простой интерфейс для регистрации функций, вызываемых при нормальном закрытии программы. Модуль sys также предоставляет хук sys.exitfunc, но там может быть зарегистрирована только одна функция. Реестр atexit может использоваться несколькими модулями и библиотеками одновременно.

# шаблон начинается
#####################################

  
# импорт библиотек для обработки ввода / вывода
# на общем уровне

import atexit, io, sys

  
# Реализация потока с использованием байтов в памяти
# буфер. Он наследует BufferedIOBase.

buffer = io.BytesIO()

sys.stdout = buffer

  
# распечатать через здесь

@atexit.register

def write():

    sys.__stdout__.write(buffer.getvalue())

  
#####################################
# шаблон заканчивается

  
# нормальный метод следовал
# вход N

n = int(raw_input())

  
# введите массив

arr = [int(x) for x in raw_input().split()]

  
# инициализировать переменную

summation = 0

  
# рассчитать сумму

for x in arr:

    summation += x

  
# распечатать ответ

print(summation)

Обычно при обработке большого количества данных обычный метод не может быть выполнен в установленные сроки. Метод 2 помогает поддерживать большое количество данных ввода / вывода. Метод 3 самый быстрый. Обычно обработка входных файлов данных размером более 2 или 3 МБ осуществляется с помощью методов 2 и 3.

Примечание: вышеупомянутые коды в Python 2.7, для использования в версиях Python 3.X. Просто замените raw_input () на синтаксис Python 3.X input () . Отдых должен работать нормально.

Ссылки:
1. Подробнее о вводе в Python 2.7
2. Вывод через библиотеку sys и другие команды.
3. Ввод через библиотеку sys и другие команды.
4. Python atexit Модуль документов.

Эта статья предоставлена Shubham Saxena . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

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

Рекомендуемые посты:

Методы ввода Python для конкурентного программирования

0.00 (0%) 0 votes