Python или не Python

    Я расскажу о проблемах с которыми столкнулся, выбрав Python3 первым языком.
    Я не изучал программирование в университете.
    Я не хочу начинать holywar.

    В 2016 Google советовал учить Python3 если нужен:

    1. Легкий для старта язык.
    2. Язык для машинного обучения.
    3. Язык для простых 2d игр.

    1. Я посмотрел первую лекцию курса Harvard CS50 на сайте JavaRush и понял, что не хочу:

    #include <stdio.h>
    int main(int argc, const char *argv[]) {
        printf("Hello world\n");
        return 0;
    }
    

    Когда можно так:

    print('Monty Python')
    

    JavaScript испугал комбинацией из трех систем: JS/HTML/CSS.

    2. Машинное обучение вдохновляло тем, что все статьи и примеры напоминали киберпанк и научную-фантастику.

    3. Можно программировать игры? Супер!

    Я сделал import this, оценил философию Python и начал читать книгу Майкла Доусона «Программируем на Python». Через три недели после «Hello World!» я написал клон игры Life с GUI интерфейсом. Я полюбил Python и когда начались сложности я думал, что недостаточно знаю и пишу плохие алгоритмы.

    Скорость

    Я использовал tkinter и рисовал прямоугольники для создания клеток.
    Поле 800x640. Размер клетки 10x10.

    class Square(object):
        def __init__(self, canvas, x, y, size, main):
            self.canvas = canvas
            self.cel = self.canvas.create_rectangle(x, y, x + size, y + size, fill='#EEEEEE')
            self.main = main
            self.color_change = True
            self.canvas.tag_bind(self.cel, '<ButtonPress-1>', self.paint)
    



    Такое маленькое поле не успевало полностью заполниться. Около 600 клеток быстро обновлялись, но как только, я уменьшил размер клетки до 4 – упала скорость изменения состояний клеток и отклика интерфейса.

    Я удалил класс Square и начал рисовать пиксели по изображению. Интерфейс заработал нормально, но после 200 клеток все обновлялось очень медленно. Я нашел проблему в алгоритме. Рисовать клетку из 4 пикселей медленнее, чем из 1 пикселя.

    def fill_black(self, x, y, color):
            for i in range((-self.cell // 2) - 1, (self.cell // 2) - 1):
                for j in range((-self.cell // 2) - 1, (self.cell // 2) - 1):
                    xx = (x + i) % self.can_width
                    yy = (y + j) % self.can_height
                    self.cell_matrix.put(color, (xx, yy))
    

    После исправлений, я получил 600 клеток на нормальной скорости и очень мелкие фигуры на экране. Мне удалось довести скорость до 900 клеток, когда я перестал проверять изображение на «черный пиксель» и стал хранить состояние системы в матрице.

    def fill_black(self, coords, color, virt_color):
        x, y = coords
        self.virt_mat[x][y] = virt_color
        self.cell_matrix.put(color, (x, y))
    

    Я установил pygame, перенес алгоритм и получил 9000 клеток на 4 fps. Но ведь игры работают быстрее, а там не только точки на экране.
    Я начал подозревать, что дело в языке.
    Я попробовал Cython. Система из 30000 клеток заработала на 4 fps.



    Я не хотел С, но получил С.

    Как запаковать для переносимости на другой компьютер?

    С этим я справился с помощью py2app, но так и не понял как это работает.

    Стандартная библиотека и сторонние модули

    У меня не получилось этого оценить. Я постоянно устанавливал что-то еще и, иногда, модули не хотели работать друг с другом. У меня было три venv для отдельной запаковки приложений с tkinter, tkinter + pillow и pygame. Я смотрел в папку site-packages и не знал, что от чего зависит и зачем оно там лежит. Я не писал свои модули. Я искал готовые.

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

    Я выбрал Lua. Почему-то, я выбрал еще один язык с не совсем привычным синтаксисом :-)

    Скорость

    Я сделал Life на Lua + Love2d. Я просто использовал функции языка и движка.

    function Life:draw()
        love.graphics.setCanvas(self.canvas)
        love.graphics.clear()
        for y=1,self.rows do
            for x=1,self.cols do
                if self.cells[y][x]==1 then
                    love.graphics.setColor(self.color)
                    love.graphics.points(x-1,y-1)
                end
            end
        end
        love.graphics.setCanvas()
        love.graphics.setColor(set.WHITE)
        love.graphics.draw(self.canvas,self.x,self.y)
    end
    

    При 111735 живых клетках система работает на 18 fps.



    Как запаковать для переносимости на другой компьютер?

    Я написал скрипты на Lua + Love2d для запаковки приложений для MacOS и Windows. Да, инструкция есть на сайте, но теперь для меня этот процесс не так «волшебен», как с py2app.

    Маленькая стандартная библиотека

    Мне не хватало привычных функций Python: map, filter, reduce, range и пришлось сделать функциональную библиотеку. В Lua нет классов, но я почитал как их добавить в язык и лучше понял как работают классы в Python. Только с Lua я полюбил замыкания и генераторы.

    Когда я попробовал все функции стандартной библиотеки и треть функций из модулей для взаимодействия с языком С, то у меня сложилось общее представление о языке. Это очень приятное чувство. Lua как-будто, хорошо подходит для начала, но язык не популярен.

    Если бы я мог заново выбрать первый язык, то я начинал бы с JavaScript.
    Почему?

    1. Язык запускается в браузерах.
    2. Популярен.
    3. Знакомство с web.
    4. JavaScript + pixi.js и игра Life заработатает без проблем.

    А Python я бы стал изучать вместе с алгоритмами машинного обучения.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 14

      +2
      Я посмотрел первую лекцию JavaRush и понял, что не хочу:
      #include <stdio.h>
      int main(int argc, const char *argv[]) {
          printf("Hello world\n");
          return 0;
      } 
      

      Я не специалист в JavaRush, но мне кажется подозрительным, что в первой лекции курса со словом «Java» в названии приводится Hello Horld на C.
      Но вообще понятно, что автор хотел сказать.
        +2
        Простите, я не точно выразился. Исправлю на «Я посмотрел первую лекцию курса Harvard CS50 на сайте JavaRush»
        0
        Lua как-будто, хорошо подходит для начала, но язык не популярен.

        Вот это аргумент! Всем аргументам аргумент! Жаль, близзарды его не слышали.
          0
          Есть еще Roblox. В нем используют Lua для создания скриптов для игр.
          Сложно оценить количество активных пользователей/создателей.
          Говорят о 10 миллионах активных юзеров в месяц.

          Но рейтинг Lua на habr 11.44, а у Python 193.12

          Lua – не универсальный инструмент и больше всего используется в разработке игр.
            0
            Lua – не универсальный инструмент и больше всего используется в разработке игр.

            Отнюдь.
              0
              Я знаю про машинное обучение и torch.ch, но есть более популярная версия pytorch.org.

              Есть web-фреймворки leafo.net/lapis luvit.io

              Используется как встраиваемый язык.

              Какие еще области применения?
                0
                Тащемто любые, поскольку, как правильно отмечено, (но почему-то выводы не сделаны) Lua — встраиваемый язык. Кроме того, используя ffi в luajit можно цеплять сишные либы.
                  0

                  Извините, я не правильно употребил слово «не универсальный».


                  Правильно говорить о преимуществах Lua и эффективности в определенных сферах.

                    0

                    Снова отнюдь.
                    Я искал применения, где Lua ну очень неуместен. И не нашел.


                    GUI: wxLua, UIP
                    Web: nginx/openresty
                    2D: Love2d
                    3D: xRays (S.T.A.L.K.E.R.), Garry's Mod (это Source), MTA, Unity, UE
                    Биржевые роботы: QUIK
                    Железо: mikrotik, asterisk


                    … и так повсюду.
                    Хотите логическую надстройку в свой фреймворк — то же самое.

                      0

                      В раздел GUI можно добавить libui, а nuklear хорош с Love2d

          0
          Lua как-будто, хорошо подходит для начала, но язык не популярен.

          Если бы я мог заново выбрать первый язык, то я начинал бы с JavaScript.

          У вас между этими строками потерялась пара абзацев на тему почему не Lua.

            0

            Мне Lua нравится.
            Я еще не нашел для себя недостатков, а с чужие слова не хочу повторять.

            +2
            Честно говоря этот рассказ с моей точки зрения выглядит примерно так:
            «Никогда не занимался ремонтом. Решил начать знакомство с этой темой с работы мастерком. Но вдруг обнаружил что масторком очень неудобно забивать гвозди. Я уже и грузики приделывал и ручку удлинял, но молоток все равно лучше. Лучше бы я начал работать с пилой.»
              0

              Отличная аналогия.
              Вы правы, я столкнулся с проблемой выбора инструмента.
              Без опыта «ремонта» не смог отличить мастерок от молотка.


              Теперь поступил бы по-другому.

            Only users with full accounts can post comments. Log in, please.