Comments 21
Интересно, насколько list comprehension ускорил бы (много где вижу for — append)
А почему вы даже копируете матрицу и то "вручную"? Есть же встроенные методы для этого.
import copy
x1 = [[]]
x2 = copy.deepcopy(x1)
x1[0].append(1)
print(x2) # [[]]
def copy(self, matrix = None):
"""
Возвращает копию матрицы
"""
if matrix == None:
matrix = self.matrix
result = []
if self.checkvector(matrix = matrix):
for i in matrix:
result.append(i)
else:
i = len(matrix)
j = len(matrix[0])
for i_ in range(i):
temp = []
for j_ in range(j):
temp.append(matrix[i_][j_])
result.append(temp)
return result
Вы нарочно постарались сделать помедленнее?
О, докину сюда же.
Вместо if(n == None):
нужно делать if n is None:
.
Зачем вы пишете return(matrix)
? Это дезориентирует. return
— это не функция, а скобки в питоне используются для создания кортежей, хотя здесь запятой нет и это можно нечаянно не заметить. Не делайте так.
Еще в питоне можно сделать так: [0] * 10
и получить список из десяти нулей.
Вот этот ваш кусок сломается, если высота матрицы больше ширины:
matrix = []
for i in range(self.I):
temp = []
for j in range(self.J):
temp.append(0)
temp[i] = 1
matrix.append(temp)
return(matrix)
А что это у вас метод сложения матриц 0 возвращает, если матрицы несовместимы? ой всё… даже читать дальше не хочется. Ну хотя бы Лутца почитайте. Нельзя же с этим сразу кидаться статью писать. Вдруг какие-то еще более новички в питоне у вас чему-нибудь плохому "научатся".
ох…
Не имейте привычки вставлять свои принты в код. Надо учиться правильно работать с исключениями.
Что вы вообще хотели сказать этой статьёй? Что первая наивная лабораторная на до сих пор незнакомом языке программирования — это хорошая тема для статьи?
Что вы вообще хотели сказать этой статьёй? Что первая наивная лабораторная на до сих пор незнакомом языке программирования — это хорошая тема для статьи?
Нет, чтобы опытные пользователи указали на ошибки. Преподаватель введёт матрицу максимум 4х4, проверит работу программы и всё, не будет копаться в коде и не укажет ошибки на которые вы указали. Спасибо, исправлю
В том-то и дело. Я боюсь, что кто-то придёт учиться по этой статье, по этому коду! Ума не приложу зачем я влез в эти каменты. Автор выбрал слишком дорогих репетиторов вместо того, чтобы почитать азы там, где это следовало бы.
На месте препода я бы влепил трояк, честно сказать, особенно если бы узнал про статью. Вообще не понятно о чем тут задание? Автора программировать пытались научить, или с матрицами работать?
Вот действительно, давайте придумаем такого сферического новичка в вакууме, которому эта статья могла бы оказаться полезной и при этом ко всему еще и не вредной. ХЗ.
Новички хороши тем, что они имеют все шансы стать лучше нас. Но в том, что нужно поднимать, только тех кто хочет стоять я с вами согласен на все 100% (даже чуть больше, я же все-таки в школе работаю).
Наверное, мне нужно быть чуть строже и наконец-то снять розовые очки, но я ярый фанат фильма «Прирожденные убийцы» :)
Пожалуй я тоже был слегка излишне язвителен по отношению к автору. Посыпаю голову пеплом. Но если автор еще разродится подобной статьёй с таким же кодом не потратив даже пару вечеров на чтение Лутца или просто постижение азов питона, то яду будет куда больше.
А так-то парень хоть взял и написал, да оформил, а у меня до сих пор все мои статьи в черновиках шлифуются. Скорее всего истина где-то посередине и лишний перфекционизм — тоже плохо.
О Питоне складывается такое впечатление, что все удобное и понятное = очень медленное. Так что, если хочется выжать из него все возможное, то это использование всего, что ближе всего к языку Си, на котором он реализован: генераторы, кортежи, итераторы, слайсы. Однако, тоже самое можно сказать и про нумпу с нумбой. В конечном итоге все упирается в вопрос что важнее скорость разработки или скорость работы программы?
Но обычно все делается именно так как вы и делаете. Сначала быстро пишется прототип, а потом постепенно переводится на Си++ и Кьюду.
Обязательно, поделитесь результатами.
все удобное и понятное = очень медленное
Ну вообще-то не всё так однозначно.
В данном случае автор как будто постарался написать на питоне как на C. Это всегда плохая идея — использовать язык не по назначению и не так, как было задумано разработчиками.
В коде рассматриваемой библиотеки всё написано совсем не по-питоновски.
А еще в некоторых случаях производительности питона достаточно, а вот в других языках недостаёт выразительности и простоты. "С" безусловно быстрее, но в нём нет сахара для ООП и прочего, бизнес-логика на нём будет нечитабельной.
Во многих случаях достаточно аккуратно написанного прототипа, чтобы отработать весь (порой не маленький) жизненный цикл приложения. Питон в этом смысле достаточно хорош, если не пытаться на нём делать вещи в которых он не эффективен.
Кстати, есть же еще архитектурные приёмы, которые позволяют разменять производительность на железо за счет масштабирования. Если хорошо написанный питоновский код окажется легче разделить и модифицировать для улучшения масштабируемости, чем хорошо написанный более нативный код на С/С++, то выбор питона уже оправдан, несмотря на в целом меньшую производительность.
Железо дёшево и дешевеет, а программисты, особенно хорошие низкоуровневые очень дороги и не дешевеют.
А те части, где критична скорость — переписывают на C или даже ASM. Уже после того, как алгоритм отработан и работает в живом проекте. Собственно упомянутая NumPy из этого и родилась.
Клон NumPy
Какой же это клон. Где всё это в вашем "клоне"?
- a powerful N-dimensional array object
- sophisticated (broadcasting) functions
- tools for integrating C/C++ and Fortran code
- useful linear algebra, Fourier transform, and random number capabilities
numpy — это титанический труд, а у вас всего лишь несколько операций над матрицами, сделанные в лоб и тяп-ляп. :)
Ну, как раз для работы с векторами и матрицами — питон — очень популярная платформа. Особенно сейчас столкнулся с машинным обучением — и там практически вся (начальная) разработка моделей выполняется на питоне + визуализация через Jupyter Notebook + модули к нему. Очень удобненько, этакая замена Excel'у и MatLab'у но с паблик модулями и человеческим синтаксисом. :)
Еще и в Docker впихивается чтобы инженерам удобней было поднять весь эсперимент где требуется.
А потом уже разработанную модель можно грузить в продакшен как удобно — tensorflow можно и напрямую в плюсах поднять. Ну и питон код что подготавливает данные обычно нет проблем воспроизвести в том же С/С++, в сумме все в плюсе (програмистам легко понять и воспроизвести, математикам ненадо заморачиватся проблемами низко-уровневых языков).
Да ладно! Было бы желание. Я в том смысле, что преподы обычно с удовольствием разрешают взять в качестве задания свою собственную тему студента. Да и не важно на каких примерах осваивать профессию, просто если это интересная тема, то она и выполняется с бОльшим желанием.
А вот такие синтетические формальные задания, как мне кажется, получают те, кому не очень-то и интересно то, чему они учатся и у них нет идей поинтереснее.
Ну я в детстве тоже писал программы в тетрадочке потому, что не было компьютера дома, а в школе урок информатики и кусочек времени после уроков, когда удавалось дорваться до компов слишком коротки.
Я бы сказал, что интерес — это скорее вопреки всему, хотя, наверно, хороший учитель порой способен пробудить его к своей теме.
Можно сделать сильно быстрее, если взять модуль array из стандартной библиотеки. Но все-таки еще лучше пользоваться numpy — это почти часть языка, есть несколько встроенных в Python вещей чисто для нужд numpy.
Клон NumPy