Python: каков наиболее эффективный способ печати списка списков? - PullRequest
0 голосов
/ 18 мая 2019

В частности, у меня есть такой список: [[1,2,3], [4,5,6], [7,8,9], [10]], и я хочу напечатать его так:

1 2 3
4 5 6
7 8 9
10

Я думал, что что-то вроде этого будет довольно эффективным:

    a = [[1,2,3], [4,5,6], [7,8,9], [10]]    
    for sublist in a:
        print(*sublist)

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

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

Ответы [ 2 ]

4 голосов
/ 18 мая 2019

Большая часть накладных расходов на печать приходится на «настройку» и «срыв» логики печати, так сказать. Поэтому, если вы объединяете все в одну длинную строку и затем печатаете ее, она должна быть намного быстрее:

print('\n'.join(' '.join(map(str, sub)) for sub in a))

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

a = [list(range(10)), list(range(10, 20)), list(range(20, 30))]    

# OP's original solution
%timeit for sublist in a: print(*sublist)
# 1.74 ms ± 89.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# another answer's solution
%timeit res = [' '.join(map(str,item)) for item in a]; print(*res, sep='\n')
# 191 µs ± 17.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# my solution
%timeit print('\n'.join(' '.join(map(str, sub)) for sub in a))
# 78.2 µs ± 5 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
1 голос
/ 18 мая 2019

Начните с объединения внутренних списков в виде строки, чтобы составить список строк.

Затем используйте распаковщик итератора для распаковки внутренних списков и используйте \n в качестве разделителя.

li = [[1,2,3], [4,5,6], [7,8,9], [10]]

#Join the inner lists as a string to make a list of strings
#Print them using newline separator
print(*[' '.join(map(str,item)) for item in li], sep='\n')

Выход

1 2 3
4 5 6
7 8 9
10

Также не имеет смысла печатать thousands of sublists, and each of those are themselves thousands of numbers как @DYZ, упомянутый в комментарии, вы можете использовать, скажем, интервал для их сохранения, например, [[1,3],[4,6],[7,9],[10]

...