Как стать автором
Обновить

Комментарии 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, проверит работу программы и всё, не будет копаться в коде и не укажет ошибки на которые вы указали. Спасибо, исправлю

для такого есть ресурсы типа stackexchange, нет?

Отдельного российского языкового раздела под такое не завели. ru SO маленько про другое, ML и CodeReview на буржуйcком. Как вариант местный тостер как более универсальный вариант разве что использовать.

Конечно же Хабр это торт для избранных профи, а новички пусть собирают крошки :) Суть статьи в том, что человек учится, что-то делает, а ведь мог бы и ерундой заниматься. ЧСВ в статье нет. Возможно, в этой статье нет пользы именно для вас, так же как и для меня она абсолютно бесполезна. Но кому-то она пользу все-таки сможет принести. Впрочем, как и ваш добродушный, сердечный и теплый комментарий :)

В том-то и дело. Я боюсь, что кто-то придёт учиться по этой статье, по этому коду! Ума не приложу зачем я влез в эти каменты. Автор выбрал слишком дорогих репетиторов вместо того, чтобы почитать азы там, где это следовало бы.


На месте препода я бы влепил трояк, честно сказать, особенно если бы узнал про статью. Вообще не понятно о чем тут задание? Автора программировать пытались научить, или с матрицами работать?


Вот действительно, давайте придумаем такого сферического новичка в вакууме, которому эта статья могла бы оказаться полезной и при этом ко всему еще и не вредной. ХЗ.

Ну не знаю. Судя по запросам, по которым ко мне попадают на сайт, «бывалые ребята» моим сайтом вообще не пользуются — идут к офдокам, зато видно что новички даже не понимают, что нужно гуглить. Но ведь все равно гуглят! Что-то типа «как в нампай плющить массивы» или «что такое -1 в a.reshape(5,-1)». А что если кому-то не повезло с преподом, или нет денег на онлайн школу и он вообще самоучка? Я сам был таким самоучкой, который к своему стыду, надо признаться, очень долго боялся именно вот таких комментариев и реакций. А еще я очень долго стремался, того что я всего лишь учитель информатики в начальной школе :) А еще я помню, как в далеком 2013 году пытался найти примеры реализации метода Полларда на Питоне и все что удалось найти это код подобный коду автора данной статьи. Но мне это помогло.

Новички хороши тем, что они имеют все шансы стать лучше нас. Но в том, что нужно поднимать, только тех кто хочет стоять я с вами согласен на все 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.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации