Запись большого количества больших списков в файл - PullRequest
2 голосов
/ 20 апреля 2020

Я хотел проверить работоспособность алгоритма, поэтому я решил создать текстовый файл, содержащий все входные тестовые примеры. Моя главная цель - создать два непересекающихся списка, которые имеют максимальный размер 10 ^ 5. Таким образом, самым простым способом было создать два списка.

  • список 1 будет начинаться с 0 и go до 99999

  • список 2 начнется от -100000 и go до -1

Таким образом, первый набор списков будет

list1: -100000

list2: 0

Второй набор будет

list1: -100000 -99999

list2: 0 1

и будет продолжаться до 10 ^ 5-й итерации

list1: -100000 -99999 ... -1

list2: 0 1 ... 99999

Итак, я написал этот код

#!/usr/bin/python3

ip = open("input.dat", "w+")

for length in range(1, 10**5+1):
    arr1 = [var1 for var1 in range(length)]
    arr2 = [var2-(10**5) for var2 in range(length)]
    ip.writelines(["%s " % item  for item in arr1])
    ip.writelines("\n")
    ip.writelines(["%s " % item  for item in arr2])
    ip.writelines("\n\n")

ip.close()

Но это очень неэффективно, и займет много времени для обработки. Есть ли эффективный способ сделать то же самое?

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Этот код более эффективен, но все еще бесполезен для случая 10**5.

#!/usr/bin/python3

ip = open("input.dat", "w+")

N = 10**4

string_arr1 = ""
string_arr2 = ""
for lenght in range(0, N):
    string_arr1 += "%s " % lenght
    string_arr2 += "%s " % (lenght-N)
    ip.write(string_arr1 + "\n")
    ip.write(string_arr2 + "\n\n")

ip.close()

На моем компьютере он работает менее 2 секунд.

Редактировать: исправлено несколько ошибок.

1 голос
/ 20 апреля 2020

Неясно, хотите ли вы, чтобы массивы содержали 1000 или 100000 элементов: 10 5 - это 100000, а не 10000, как указано в вашем вопросе.

Вам не нужно создавать промежуточные массивы. Просто переберите целочисленные переменные. Я получаю сокращение на 23% прошедшего времени (29,1 с против 37,7 с) для 10000 элементов с этим кодом:

#!/usr/bin/python

# iterating to 10**4 generates a 538,995,000 byte file (539MB)
# iterating to 10**5 would produce more than 100x that much
max = 10000

ip = open("input.dat", "w+")

for length in range(1, max+1):
    ip.writelines(["%s " % item  for item in range(length)])
    ip.writelines("\n")
    ip.writelines(["%s " % item  for item in range(-max, length-max)])
    ip.writelines("\n\n")

ip.close()

Время, затрачиваемое на преобразование элементов массива в строки и запись в файл. Создание массивов происходит быстрее, особенно когда создание отложено, как в данном случае. ip.writelines принимает итеративный объект, который вообще не может быть создан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...