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

Комментарии (12)


  1. Bringoff
    05.12.2019 23:25
    +1

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

    Я не специалист в JavaRush, но мне кажется подозрительным, что в первой лекции курса со словом «Java» в названии приводится Hello Horld на C.
    Но вообще понятно, что автор хотел сказать.


    1. veledzimovich Автор
      05.12.2019 23:35

      Простите, я не точно выразился. Исправлю на «Я посмотрел первую лекцию курса Harvard CS50 на сайте JavaRush»


  1. LibrarianOok
    06.12.2019 09:24

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

    Вот это аргумент! Всем аргументам аргумент! Жаль, близзарды его не слышали.


    1. veledzimovich Автор
      06.12.2019 11:37

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

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

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


      1. LibrarianOok
        06.12.2019 12:08

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

        Отнюдь.


        1. veledzimovich Автор
          06.12.2019 12:16

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

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

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

          Какие еще области применения?


          1. LibrarianOok
            06.12.2019 12:53

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


            1. veledzimovich Автор
              06.12.2019 13:25

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


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


  1. extempl
    06.12.2019 10:04

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

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

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


    1. veledzimovich Автор
      06.12.2019 11:35

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


  1. Sklott
    06.12.2019 11:21
    +2

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


    1. veledzimovich Автор
      06.12.2019 11:33

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


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