«Древняя китайская мудрость гласит: чтобы ускорить код на Python, нужно максимально убрать из него Python. Делать это можно разными способами! Один из них – так называемая векторизация, при которой мы не пишем: «Пройди по всем элементам двух массивов и сложи их», а прямо так и говорим: «Сложи эти два массива», или, другими словами, два вектора. Такие операции в NumPy реализованы на C и вдобавок оптимизированы, например, с помощью SIMD-инструкций. Для большой доли задач это удобно, и к этому привыкаешь. Более сложные операции иногда ломают мозг – как, например, бывает в случае с функцией-швейцарским ножом numpy.einsum, – а какие-то алгоритмы векторизации не поддаются в принципе. Тогда на помощь приходят другие средства, такие как Numba или Cython. Первая делает подмножество Python компилируемым языком, в полном смысле этого слова, а второй подходит к вопросу с другой стороны, расширяя синтаксис Python и позволяя писать на чем-то среднем между Python и C/C++. Есть еще и альтернативные интерпретаторы, вроде PyPy, которые могут быть полезны в других сценариях – например, если речь идет не о машинном обучении и прочем «перемалывании чисел», а о веб-бэкенде. В общем, правда ли, что Python медленный? Да, но это поправимо! :)»
Комментарий недоступен
Обожаю Python, но терпеть не могу, когда его противопоставляют Java, C/C++. Разные они, и созданы для разных задач. Python уместно сравнивать с perl, php, ruby, R (в контексте data science) etc.
Но язык прекрасный! И вот уже достаточно взрослый ))
Мы вас конечно поздравляем, но идём изучать гошку 😄
Вот преимущества питона как первого яп: непонимание типов данных, непонимание связей структур данных, непонимание абстракций, 95% питонщиков пишут в императивном стиле, им кто то сказал что питон объектный язык, но что такое объект спроси их и бэ мэ их ответ будет.
1. А если все-таки не побояться и заглянуть в модуль typing? Прочитать о декларациях типов? На мой взгляд в python изящнее всего решена проблема типизации для контекстно типизированного (фактически нетипизированного) языка.
2. —-- //—-- в модуль collections? Ну и встроенные list, dict, set. И в copy.deepcopy заодно, чтобы не удивляться.
3. —-- //—-- в модуль abc? Вы не поверите! Это [A]bstract [B]ase [C]lasses.
4. 95% как считали? Декораторы, pydantic, dataclasses видели? С точки зрения парадигмы это - декларативный стиль. Про функциональный рассказывать? Есть такой: и лямбды, и partial, и map/reduce, и генераторы. Глубина рекурсии, правда, ограничена целым числом, но его можно изменить. Объектно-ориентированная парадигма тоже присутствует за исключением, пожалуй, сокрытия полей/методов (там соглашение о __dunder). Ну еще нюансы с super() и __mro__.
А вот, что такое "объектный" язык, я и вправду не знаю. Но, если что, все пользовательские классы наследуются от класса object. Это такой объект типа type )
Все, что упомянул, кроме pydantic, есть встроенные модули. Нормальный python-программер о них обычно знает, независимо от того: первый это язык или нет.
Вот чего python действительно не дает - это понимания интерфейсного (контрактного) программирования. Реализовать некое подобие через подмешивание классов с абстрактными методами можно, но как-то не принято это. Здесь явное лучше неявного ))
Начинать с питона это как начинать работать сборщиком мебели по одним лишь икеевским шкафам. Так можно, и шкаф в итоге будет таки собран, но нормальным сборщиком мебели так точно не станешь.
После c# изучение python - это такая боль (знаю по себе). В c# я всегда знаю что за тип передо мной, в python перед тобой может быть всё что угодно