Местная фабрика канцелярских товаров заказала программу, которая генерирует таблицы умножения.
Давайте поможем производителю.
Формат ввода
Вводится одно натуральное число — требуемый размер таблицы.
Формат вывода
Таблица умножения заданного размера.
Примечание
itertools.product отличный способ, чтобы избавиться от вложенных циклов.
Пример
Ввод
3Вывод
1 2 3
2 4 6
3 6 9Ввод
5Вывод
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25Решение
Яндекс рекомендует использовать product() для того, чтобы избежать вложенных циклов. Обратная сторона такого решения — мы получаем на выходе плоский (одномерный) список, но есть и хорошие новости — у нас есть islice().
Посмотреть код
Решение
Python
from itertools import product, islice
size = int(input())
nums = range(1, size + 1)
table = [x * y for x, y in product(nums, repeat=2)]
for row in range(size):
print(*islice(table, row * size, (row + 1) * size))
А что за звёздочка перед islice?
Это так называемая распаковка. Ее суть в том, чтобы вытаскивать элементы по одному, пока они не закончатся. Довольно обширная тема и все никак руки не доберутся написать про нее статью. К счастью, это легко гуглится.
Доброго времени суток!
Знаю, что яндекс просит использовать «product()«.
Но хотел бы уточнить. Это более оптимальное решение, чем просто создать сразу список чисел?
»
from itertools import islice
size = int(input())
numbers = [i for i in range(1, size ** 2 + 1)]
for row in range(size):
print(*islice(numbers, row * size, (row + 1) * size))
Когда речь идет о производительности python, говорить и рассуждать становится всегда очень сложно.
Чаще всего потому, что это связано с ограничениями и архитектурными решениями самой реализации языка.
Можно рассуждать с точки зрения сложности алгоритмов (N) но этот подход не лишен своих недостатков и не дает точного представления о сравнении, например, эффективности двух линейных решений.
Нужен ли здесь product()? Очевидно, что нет. Оптимально ли тут его использовать? Смотря с чем сравнивать. И здесь без тестов однозначно не ответить. Потому что в python многие библиотеки реализованы на CPython, а некоторые и вовсе на C для ускорения. И такие библиотеки будут показывать существенный прирост производительности по сравнению с чистым python. Но и тут не без сюрпризов. На хабре пролетала статья, когда изменение алгоритма одной из функций реализованных в широко используемом работы с математическими величинами mumpy, ускорила одну из математических операций примерно в полтора-два раза будучи написаной на python. Это при том, что сам numpy — написан на C и в теории эта реализация в 1000 раз быстрее прямой реализации на пайтоне. Как видно из примера, ответ на этот вопрос нелинеен и сильно зависит от того, каким способом реализован тот или иной код, насколько продвинутые алгоритмы лежат в основе решения, какой язык программирования использовался для реализации этих алгоритмов. Все это влияет на ответ в вопросе выбора «оптимального» решения.
А иногда и вовсе бывает, что простота кода важнее его производительности.
Спасибо за ответ!