«Python — це повільно» та інші забобони людей за сорок

Всім привіт. Я Саша Каленюк, працюю алгоритмістом, дописую книжку Geometry for Programmers, а ще частенько пишу статті на DOU.

Як я був малий, то програмувати було просто. У мене був друг, у друга був комп’ютер, на комп’ютері були лише Бейсик і Асемблер. Хочеш — пиши на Бейсику, швидше напишеш програму, але працювати вона буде повільно. А хочеш — пиши на Асемблері. Писатимеш довше, але програма бігатиме швидко.

Розібратися, чому так, теж було нескладно. Бейсік був інтерпретатором, тобто щоб запустити програму, він мав щоразу проходитись через сорци і буквально інтерпретувати програму рядок за рядком. Якщо в сорцах було «PRINT X», то Бейсік мав знайти змінну із ім’ям «X», потім знайти власну підпрограму, яка називається «PRINT» і виконати цю підпрограму із значенням щойно знайденої змінної.

Асемблер був, ну, асемблером. Він теж свого роду інтерпретував програму, але тільки один раз при власне асемблюванні. Потім програма перетворювалась на машинний код, який виконувався без жодної інтерпретації. Програми, яким потрібна інтерпретація, виконуються повільніше за програми, яким інтерпретація не потрібна. Звісно, якщо ми говоримо про еквівалентні програми.

І за часи Бейсіка і Асемблера програми на них були-таки майже еквівалентними. Бейсик — це імперативна мода без підтримки навіть елементів структурного програмування. Навіть така звична тепер штука як функція була в Бейсику лише патерном: «GOSUB... RETURN». Принципово нічим не кращим за асемблерний «call... ret».

Минуло тридцять років. Мов програмування безліч. Комп’ютери усюди. І незважаючи на повсюдний прогрес, програмувати чомусь геть перестало бути просто.

Багато років мій департамент заробляв, переписуючи на С++ дослідницький код оригінально написаний на Python. Ну, якийсь час вважалося, що Python — це інтерпретатор, і тому там все повільно, а С++ це компілятор, тому все переписане має автоматично літати. Але важко було не помітити, що з кожним роком здобувати якесь пришвидшення одним переписуванням ставало важче і важче. Було помітно, що щось в світі змінюється, хоча не зовсім помітно, що саме. Втім, суспільні упередження завжди відстають від технологічного прогресу, тож ми теж продовжували переписувати.

Але втиху оптимізовували все і переоптимізовували лише щоб якось довести самим собі, що це не безмістовна праця. Бо приходить алгоритм на Python, ми його переписуємо на С ++ рядок у рядок, а він стає втричі повільнішим. Трохи ганебненько. Тож ми переписуємо алгоритм з нуля, вигризаємо ті три рази, додаємо ще кількадесят процентів, і рапортуємо про успіх. Насправді, робити це не так складно як здається, бо дослідники взагалі не паряться оптимізацією, в їхньому коді завжди можна знайти, що пришвидшити.

Втім, всі ці трудовитрати виглядають як якийсь галімий розвод. Ми сповільнюємо код, переписуючи його на С++, тільки щоб потім пришвидшити його, переробляючи власне алгоритм. Чому б не пришвидшити цей алгоритм одразу в Python? Ага! Я знаю чому. Бо ми так не вміємо. Ми знаємо Python достатньо, щоб його читати, але не для того, щоб писати на ньому ультрашвидкі програми.

Так а що там знати?

Бібліотеки

Більшість Python-бібліотек написані на C чи Fortran. Ядро NumPy написано на С; Pandas на Сайтон і С; SciPy на Fortran, С і трохи навіть С++. Немає жодної причини, чому б ці бібліотеки були повільніші за будь-що, написане на C++, Rust або Julia. А от одна причина бути швидшими в них, як не парадоксально, є.

Наша компанія пише водночас і під клауд, і під десктоп. Клієнти, які користуються десктопом, не люблять, коли їх програми раптом перестають працювати. Тож наш дефолтний таргет для десктопного білда досить таки старий. Серйозно старий. Може не як Мафусаїл, але принаймні так, як Нехалем. Так навіть найретроградніші наші клієнти лишаються задоволені, але найпрогресивніші позбавлені навіть розкоші SSE3.

Ну і нічого дивного, що бібліотека, яка займається численними обчисленнями на векторах, і качається із свіжого красивого пітонівського репозиторія, працює швидше ніж схожа бібліотека на С++, але зібрана під узагальнену архітектуру п’ятнадятирічної давнини.

Втішає тільки те, що якщо збирати проєкт спеціально під хмару, то можна налаштувати таргет на саме ту машину, що орендуватимеш в хмарі, і витиснути з неї все, що з неї витискається. І С++ код тоді бігатиме не повільніше за пітонівські бібліотеки. Але і не швидше.

Компілятори

Якщо так подумати, то всі суперечки про те, яка мова швидше, не мають жодного сенсу. Мова — це не компілятор, і не інтерпретатор. Мова — це мова. Лише збірка правил, які визначають, як саме ми кажемо комп’ютеру, що йому робити.

Увесь цей поділ мов на інтерпретатори і компілятори — частина міфології минулого сторіччя, яке в наш час жодного практичного значення не має. В наш час є як інтерпретатори для С, як наприклад IGCC, PicoC, чи CCons, так і компілятори Python. Як just-in-time, наприклад PyPy, так і ahead-of-time, як наприклад Codon.

Codon побудован на LLVM, на тій самій інфраструктурі, що і Rust, Julia або Clang. Код, зібраний Codon, працює плюс-мінус так само, як і код, написаний на будь-якій з вищеназваних.

А ще ми зберегли з минулого сторіччя одразу два міфи про just-in-time компіляцію. Перший — про те, що JIT перевершує AOT через те, що завжди компілює під наявну архітектуру, а отже, і використовує її найоптимальніше. А другий — про те, що сама компіляція під час виконання додає такий штраф на швидкодію, що жодного зиску від JIT практично неможливо побачити.

Проблема цих міфів в тому, що вони обидва грунтуються на правді, але ніяк не допомагають в прийнятті архітектурних рішень. JIT дійсно використовує архітектуру заліза найоптимальніше, що може давати об’єктивну перевагу технології, якщо продукт компіляції призначений запускатися на необмеженій кількості типів пристроїв: від персоналок до наручних годинників. Але якщо ми запускаємо хмарний сервіс, то ми і так знаємо архітектуру заліза, яке замовляємо і можемо оптимізувати код під час AOT-компіляції.

З іншого боку, штраф від JIT-компіляції проявляє себе найбільше, коли ми запускаємо один і той же процесс багато разів. Якщо ми запускаємо, і зрештою компілюємо, нашу програму раз на реліз, що теж цілком реалістичне очікування від хмарного сервісу, то цей штраф розчиняється в поточному навантаженні.

Тобто і в того, і в іншого підходу є свої плюси і мінуси. І тут Python знов виграє. На відміну від С++, Python дозволяє нам обирати технологію компіляції під наші потреби, не переписуючи код. Python може бути як інтерпретатором, так і компілятором. Як JIT, так і AOT.

Numba і кернели

Якщо вже почали за JIT, то треба і продовжувати. Мабуть, найпроривніша технологія у світі ультрашвидкого програмування на Python — це Numba. Це компілятор, але компілятор, який працює в рантаймі, збираючи не всю програму, а лише конкретні шматочки коду, які називаються кернели. Це дає можливість запускати програму в режимі інтерпретації, там же вивчати і відладжувати її, і разом з тим запускати найбільш вимогливі до швидкодії фрагменти коду нативно на всіх ядрах CPU або навіть GPU.

Але це ще не прорив. Це просто зручність. Прорив полягає в тому, що писати компілятори під такі кернели набагато простіше, ніж під повні мови, тим більш такі ускладнені, як С++. Теоретично, ніхто не заважає підключити до Numba бекенд для гуглівського тензорного процессора або навіть фотонного акселератора від Lightmatter. До речі, останні пішли схожим, але трохи іншим шляхом, і викатили власну пітонівську бібліотеку, яка дозволяє керувати акселератором, а також інтегруватися із Pytorch, Tensorflow або ONNX.

Тобто Lightmatter Numba проігнорували, а от NVidia, наприклад, ні. Вони таки надали свій бекенд, отже тепер можна писати кернели на Python і запускати їх на пристроях NVidia із максимальною ефективністю.

Ця модель, коли програма складається із керуючого кода і окремо акселерованих кернелів, дозволяє розширюватися на будь-які пристрої. Це наші двері до світу гетерогенного програмування. Але Numba надає гетерогенному програмуванню ще один вимір, ще одне значення. В кернел-моделі ми можемо збирати різні кернели під один і той же пристрій, але із принципово різними налаштуваннями компілятора. Якщо ми хочемо виграти десь трохи швидкодії і можемо собі дозволити втратити в точності, ми можемо скомпілювати обчислювальний кернел із опцією, наприклад, «-fast-math». Не всю програму, не весь модуль трансляції, а лише один кернел в одному окремому контексті.

Висновки

Python не повільний. І не швидкий. Python — це мова, набір слів і правил. Але існує величезна спільнота, мільйони людей, які прикипіли до цих слів і правил. Їм подобається писати на Python і вони щиро зацікавлені в тому, щоб покращувати весь спектр технологій, які з Python сумісні.

Ця спільнота достатньо велика, щоб залучати як проривні стартапи на кшалт Lightmatter із їх фотонними акселераторами, так і мастодонтів масивно-паралельного програмування, таких як NVidia. Прогрес можна відчути, навіть якщо засунути голову в пісок і десять років підряд повторювати як мантру, що немає компіляторів, окрім-AOT компілятора, і LLVM пророк його. Навіть без фотонних акселераторів, код, написаний на Python, вже буває обганяє аналоги на Julia, C++ або Rust. Не щоразу, але достатньо часто, щоб це було помітно. І на цьому Python не зупиниться.

Я б очікував, що маючи зацікавлену спільноту такого масштабу, у найближчому майбутньому Python позичатиме техніки від спеціалізованих кодогенераторів, таких як Spiral або Herbie, аби генерувати такий ефективний код, який традиційні компілятори в принципі згенерувати не здатні. Зрештою, прикрутити до Python сторонній проєкт і згодувати йому синтаксичне дерево якогось кернела набагато простіше, ніж переписувати з нуля весь LLVM.

👍ПодобаєтьсяСподобалось12
До обраногоВ обраному1
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Дякую автору! Отримав задоволення, чекаю на книгу (вже за 40 та свого часу робив бінарники із Perl)

Ось висловлюсь як раз як людина «за 40», яка при тому майже більшість своїх професіональних успіхів повʼязує саме з Python.

Вся філософсько-узагальнююча частина статті, тобто її більшість — перекручення і натяжки, частково засновані на головній підміні — замість «наші специфічні задачі, історично засновані на Python» мовиться про Python в цілому. Не перекручення тільки те, що повʼязане з використанням Numba, але доречність самого його згадування тут вкрай сумнівна.

Саме в період найбільш активного професіонального росту я використовував Python в багатьох сферах, причому тих, що часто вважаються для нього нетиповими, тому що коли і швидкість процесорів, і памʼять, і обʼєми дисків — все росло як на дріжжах і всі ці скриптові засоби були «на коні», всі знали, що їх повільність буде перекрита в наступні 1-2 роки.

І якщо проблема була тільки в віці тих, хто критикує Python, то як раз покоління 40-55 років було б найактивнішим його апологетом, а не критиком.

Але реальність така, що:

1) Ріст характеристик «заліза» зупинився. Ціни на памʼять ходять в одному коридорі з 2012. Швидкість памʼяти росте для потокового читання/запису, але не для довільного — DDR5 її тільки погіршив. Швидкодія процесорів росте за рахунок паралельности команд, але не одної команди. Якщо до ~2005 компʼютер старіше 3 років треба було викидати, бо не підтримував нове, то останні 10 років це стосується хіба що RAM і частково — диска (все крім архивів — переносити на SSD).

Це саме по собі вимагає оптимальности виконання програм, і як раз наймолодіші мають відчути це на собі і вимагати ефективних засобів, а не повільних скриптових.

2) Python — що не найгірший приклад для «переваги» скриптових засобів.

В нього нема _універсальних_ ефективних засобів пришвидшення: ми маємо:

— або інфраструктуру CPython + Cython + Numba + FFI + ...
— або інфраструктуру PyPy, з якої всі інші локальні прискорювачі не дружать, і для якої нема навіть ефективного FFI.

При тому перша вимагає всі прискорювані частини писати на дуже обмеженому Python, щоб їх прискорення дійсно мало статись, а друга — здатна універсально, але на значно менше прискорення.

І всі ці засоби значно слабкіші як за створені зараз JIT для JavaScript, в який, через його використання в браузерах, вкладено на порядки більше ресурсів, так і за ті засоби, які за рахунок явної типізації отримують ефективність компіляції (наприклад, Java чи .NET світи).

Крах UnladenSwallow остаточно показав наявність проблеми, а Go її висвітлив в усіх контурах.

Концентрація автора статті на Numba показує обмеженість погляду. Використання, наприклад, Java тут було б не гірше, і часто гладкішим — без вимоги концентрувати тільки JITабельні речі в «кернелах». В світі .NET деякі речі були б ще гладкішими: C#/VB#/F#/etc. -> C++/CLI -> C++ (обмежений) або C або асемблер — там навіть наскрізне зневадження все чітко покаже (але у цього світа свої проблеми, через які він за межами MS майже не наявний).

По окремим тезам автора:

Багато років мій департамент заробляв, переписуючи на С++ дослідницький код оригінально написаний на Python.

Да, зараз це не дивно. Ситуація з залізом вимагає прискорення. Жити у старому стилі більш не можна. Наявність саме Python з історичних причин — я розповів.

Але ідея все переписати саме на C++ тут починає дивувати. Мабуть, хтось вирішив відрізати одним махом, не маючи достатньо сили. Чи автор навмисно пропустив досвід переписки на більш «проміжні» засоби, як Java. Не знаю, що з цього було насправді, і навряд чи ми почуємо правду. Але така переписка має відбуватись, так, дійсно кваліфіковано. І тому результати на зразок:

Бо приходить алгоритм на Python, ми його переписуємо на С ++ рядок у рядок, а він стає втричі повільнішим. Трохи ганебненько.

показують що або переписувачі реально не вміють в C++, або поверхневе переписування було неефективним. Тут поруч вже згадували про варіанти «new на кожний елемент double в масиві». Можливо, щось таке і було. Так, вміти в C++ важко. Я теж погано вмію. Але саме тут це не вада інструменту.

Тож наш дефолтний таргет для десктопного білда досить таки старий. Серйозно старий. Може не як Мафусаїл, але принаймні так, як Нехалем. Так навіть найретроградніші наші клієнти лишаються задоволені, але найпрогресивніші позбавлені навіть розкоші SSE3.

Проігнорую, що Nehalem підтримував SSE3. До чого тут взагалі «дефолтний таргет»? Як при такому різномаїтті можна взагалі згадувати про дефолти? При таких задачах мали компілювати з десяток варіантів від, ну добре, Nehalem і до Ryzen9-6xxx, і давати інсталювати найпідходящий. Або робити вибір у рантаймі — це можна зробити і вручну, і автоматизувати компілятором.

І С++ код тоді бігатиме не повільніше за пітонівські бібліотеки. Але і не швидше.

За _бібліотеки_. А не за Python. Ну, тут це вже казали.

Але якщо ми запускаємо хмарний сервіс, то ми і так знаємо архітектуру заліза, яке замовляємо і можемо оптимізувати код під час AOT-компіляції.

Якісний JIT використовує значно більше, ніж просто «архітектура заліза». Він може викидати зовсім або виносити в віддалені області незадіяні частини коду. Він може скорочувати віртуальний виклик функцій, якщо визначить, що реально використовуються 1-2-3 типи і для них краще підставити вручну. Він може оцінити ефективність інлайнінга на реальному використанні. Ба більше, він не протирічить AOT. В деяких сферах давно вже нормально мати AOT для варіанту без даних виконання і доробку JITом по результатах «прогріву» програми в роботі. Моє зауваження тут і на вашу підтримку, і навпаки: саме тому, що розглядаючи лише Python з одного боку, C++ з іншого (і з обмеженнями вибору в рантаймі), ви вже себе обмежили майже ескобарно.

Прорив полягає в тому, що писати компілятори під такі кернели набагато простіше, ніж під повні мови, тим більш такі ускладнені, як С++.

Але ціна за це — те, що ви самі загоняєте себе в прокрустово ліжко саме тих засобів, які Numba зі всіма її плагінами дозволяє використовувати для ефективности. А що ви робитиме, коли зʼясується, що під якусь умовну TPU3 архітектуру матимете переписати всю логіку, бо там треба робити інакше? І коли ще половина юзерів на GPU, а значна частина має тільки, ну добре, не Nehalem, а KabyLake?

Python — це мова, набір слів і правил. Але існує величезна спільнота, мільйони людей, які прикипіли до цих слів і правил.

Згоден. Сам в ній був. Але чим далі, тим більше бачу її обмеженість.
Так, я, «за сорок», не тільки бачу це, але й роблю практичні дії з того.
А ви, не «за сорок» (я вгадав?), підтримуватимете його навіть коли це не матимете сенсу?

Коли коментарій значно цікавіший статї. З цим ейджизмом дивуюсь, що майже ніхто не згадав про нідерландського 67-річного пенсіонера, який, певно в перервах між збиранням скло тари, коммітить в cpython

Заголовок ейджискій

Більшість Python-бібліотек написані на C чи Fortran. Ядро NumPy написано на С; Pandas на Сайтон і С; SciPy на Fortran, С і трохи навіть С++.

Ну так и на PowerShell Script можно писать и считать это программированием.

Вот только большинство библиотек Java написана на Java и большинство библиотек .Net на C#. И это полноценные языки, а не скриптовая оболочка над нормальными языками.

Щось якась длиннюча стаття без жодного аргументу. Жодного бенчмарку, жодного заміру, жодної цифри. Просто «мені не подобається — скучно переписувати із Python на С++». Це при умові, що там де замінювали виходило — десятки процентів, що при певних умовах бізнесу може бути дуже суттєво.

А це стаття про еджизм?

Джава тормозить!

У меня Си тормозил и АСМ, я был молод, глуп и памяти было доступно 64 кб.

Жир! В мене 32, з них без портів і відеопам’яті лишалося біля 28.

Але асемблер не гальмував.

Ніт, Java не гальмує. Доведено безпілотним автомобілем Tommy в 2005 році на перегонах DARPA Grand Challenge.

Саме так. Врізався в стіну на швидкості 100 км/год.

Начал в радиокружке в 90-x, FORTH, потом C, первая работа на C embeded, потом перешел на веб под Perl. Когда появился вордпресс, стал писать на пыхе плагины под него. Надоело, перешел на python в 2008, Twisted, Django, Pylons, Plone. Лет через 5 опять надоело, стал писать на фп языках разных (чего только не пробовал), сейчас пишу чаще на Go чем на питоне, хотя питон в проекте тоже есть.

Я к чему. Python достаточно старый язык с большим количеством легаси, для каких-то задач он подходит лучше, для каких-то хуже, перфоманс языка штука сферическая, обычно упираешься в базу/сеть, чем в перфоманс самого языка. Но лично мне некомфортно писать на одном языке много лет, всегда хочется чего-то нового, посмотреть как как у других сделано. IMHO, eдинственный плюс python что это universal glue между другими технологиями, типа ML.

universal glue

Python незамінний у багатьох ML задачах виключно через те, що на ньому дуже багато нафігачили. Прям сильно багато. Це не складна та зручна абстракція, якою зручно користуватись у тому числі і у академічних колах. Це такий компроміс між програмістами та вченими. Бо на matlab може працювати не кожен програміст а на C++ не здатен фігачити кожен науковесь. Python щось по середині.
Як Universal Glue для C/C++ наприклад Lua або Golang більш зручні.
Та і по швидкості. Я звіряв для прикладу швидкодію біндінгу DLib у FaceRecognition у Python/Golang — golang звісно сильно виграє (разів у 10).
Але із того що є у Python і нема ні у кого іншого це звичайно Jupiter Notebooks.
Хоч вже давно не використовую Python у продакшені, але для різних експериментів його використовую у інтерактивному режимі

Та й усякi Pandas. Воно iнодi дивує але працює

На Golang не всегда так удобно писать как на питоне, особенно всяким аналитикам.

Але із того що є у Python і нема ні у кого іншого це звичайно Jupiter Notebooks.

Щось ви, мʼяко кажучи, відстали від життя. Jupyter з самого початку підтримував ще Julia і R — звідти і його назва. А зараз кажуть про 100+ мов. І дивно було б інакше.
З рештою — згоден.

Якщо казати про швидкість і ML то взагалі немає ніякої різниці між python та маленькими звіряткам які загортають апі у ML лібу — усі ліби так чи інакше написані або на С або на С++ або щось такому — пайтон лише завантажує їх та передає дані на обробку. Ну так, ще є джейсон-серіалізація, міддлвейр і т.п., які після оптимізації, векторізацї і батчингу обчислень можуть займати 30% потужності (на колекціях їз 10К+ елементів), але ця переплата норм, якщо взяти до уваги що математики використовують пайтон (ви ж хочете переписувати все те що вони зробили іншою мовою?)

Персоналі, в мене до пайтону є лише одна претензія — махрове легасі та магія стандартної бібліотеки. Ну от майже як у тому стендапі про ЖС, але замість ЖС пайтон — www.destroyallsoftware.com/talks/wat

А стаття типу краще
P.s Мені скоро 40 — Що порадите Basic чи Assembler?

/IEFPROC  EXEC   PGM=IASXWR00,REGION=20K,                         X //                PARM='PA,,' //IEFRDER  DD     UNIT=TAPE,VOLUME=(,,,35),                        X //                DSNAME=SYSOUT,DISP=(NEW,KEEP),                   X //                DCB=(BLKSIZE=133,LRECL=133,BUFL=133,             X //                BUFNO=2,RECFM=FM)

Угу:))

Перфокарта — это всего лишь интерфейс построчного ввода, 80 символов хватит всем, но писать можно на любых языках // я видел как набивают перфокарты

Та який там пітон, який там с++. Ми всі завтра будемо просто ML-модельки підкидати на GPU. Яка там різниця, чим їх підкидати, хоч лопатою.

Радше за все, навіть не GPU. GPGPU — це такий трохи химерний концепт, який вже років двадцять як просуває NVidia щоб забрати собі ринок акселераторів ще до того, як він сформувався.

TPU Гугла трохи ближчий для того, щоб бути виключно пічкою для ML моделек. Але передній край — це фотонні обчислення. Їх серьозно досліджували у 80ті, але там принципове обмеження технології — бранчінг. Його немає. Що серьозний мінус для ручного програмування, але зовсім не так страшно для масово-паралельних тензорних обчислень.

Ті, кому за сорок знають, або принаймі повинні знати де python швидкий, а де повільний, де можна і варто вживати, а де за саму думку про це — лінійкою по пальцях.

*думають що знають. Це проблема досвіду: знання застарівають і не встигають за розвитком технологій, а впевненість лишається на все життя.

Так доведіть Ваші слова:

Але важко було не помітити, що з кожним роком здобувати якесь пришвидшення одним переписуванням ставало важче і важче. Було помітно, що щось в світі змінюється, хоча не зовсім помітно, що саме. Втім, суспільні упередження завжди відстають від технологічного прогресу, тож ми теж продовжували переписувати.
Але втиху оптимізовували все і переоптимізовували лише щоб якось довести самим собі, що це не безмістовна праця. Бо приходить алгоритм на Python, ми його переписуємо на С ++ рядок у рядок, а він стає втричі повільнішим.

В статті немає жодного заміра, жодного приклада, який би підтверджував ці слова. Ось програма на C++, ось її еквівалент на Python, ось параметри компіляції/компонування, рівень оптимізації, ось швидкість виконання першої програми, а ось другої... Хоча б так в першому наближенні, бо інакше слова залишаються словами.

Та вони там маллочать кожне поле класу окремо, а потім кажуть, що стало повільніше, ніж у Пітоні.

Бачив такий код, написаний науковцями. Кожен нейрон окремо new замicть double у звичайному масивi

Це проблема досвіду: знання застарівають і не встигають за розвитком технологій, а впевненість лишається на все життя.

Т.е. вы хотите сказать, что ваши знания о питоне устарели и не успевают за развитием технологии, но основываясь на вашей уверенности (которая на всю жызнь) вы по прежнему топите за пито?
ну ок, яснопонятно

лінійкою по пальцях.

Логарифмічною.

Скажите кто в теме. Каличный питухон действительно в научной среде уже уделывает матлаб или это просто неосиляторы матлаба топят за питухон? Никогда не понимал как на этом гамне без точек с запятыми можно что-то нормальное написать.

Дуже товстий тролінг. Якщо це тролінг

ну про говно без точек он попал тупа в точку, а еще пузон говно без фигурных скобок

Актуарії років 10 тому з матлаба на пітон перелазили.

Думаю, встановиться якась рівновага.

Так наче ще не 1 квітня. Ви краще напишіть десь десклаймер, а то ще хтось у це повірить. /програмую на Python 10+ років й овердофіга мав се%у з Numba й різними алгоритмами/

Заголовок "

та інші забобони людей за сорок

— треш повний . Ну ейджизм показує всього лиш рівень інтелекту того хто бачить причину в цьому. Добре спробуємо зробити вигляд що автору завжди буде не більше 39.9(9) років, але не 40 — бо з 1м днем 40річчя почнеться деградація )))
Тепер трохи про технології та розробку:
— Всім відомо на вибір технології/мов впливає дуже багато чинників крім швидкості виконання коду. Вибір тільки на основі 1-го параметру — це безглуздо
— Всім відомо що жодні синтетичні тести і їх результати не дають гарантії що ваш код буде «швидкий» на «швидкій» мові. Тому важливо розробляти архітектуру яка підтримує зміну мови в компонентах/сервісах. Всі знають що якісь специфічні use-cases/"вузькі місця" краще реалізовувати на чомусь специфічному від головного стеку.
— Всім відомо що займатись «переписуванням» тільки заради «переписування/моди/хайпу» веде тільки до збільшення витрат/ресурсів, повинно бути якесь єкономічне обгрунтування на цифрах
Що я бачу в сухому залишку по прочитанню статті:
— ну або автор не має авторитету, не вміє комунікувати в більш ширшому сенсі ніж просто «розмовляти» — тобто не може підняти питання, не може підготувати дані і докази результатів замірів/тестування, не може презентувати і аргументувати, не може стати рушієм якихось змін
— ну або він працює в токсично-застряглому місці, де все робиться за якимось слухами або за звички, де топиться будь-яка ініцатива, де люди не готові до змін
— реклама Python (який доречі не треба рекламувати) — вийшла так собі

Питання не у швидкості, питання у прогнозованості роботи програми. Якщо ваша система може дозволити собі «піти в себе» на декілька секунд (позбирати сміття за собою, Garbage Collection) тоді пишіть на чому завгодно, аби зручно було — швидкість сучасних процесорів робить різницю між умовно швидкими C/C++ та умовно повільними Python та Java абсолютно невидимою для користувача. Але, якщо ваша система повинна збирати дані в режимі реального часу та може загубити ці дані під час «прибирання сміття» чи інших «відволікань» — у вас немає іншого вибору, ніж засісти за C/C++ (або за інші складні та із прогнозованою продуктивністю без відволікань на інші процеси мови).

Одна из основных проблем таких языков как python или js — низкий порог входа, из-за чего огромное количество людей, которые не очень разбираются в программировании (но называют себя программистами).

Це не проблема, це плюс цих мов — люди без досвіду можуть швидко зробити те, що їм потрібно (тому Python номер 1 серед науковців, які не є професійними програмістами). Власне, для цього ці мови і було придумано. І давайте відверто визнаємо, що добрих 90% типових задач для типового користувача може бути вирішено за допомогою цих «умовно повільних» мов. І так, 90% типових програмістів цих типових задач взагалі не розуміють, навіщо існують інші мови. І це певне що теж нормально. 😉

Це все дуже добре, але проблема в тому, що дехто із цих «не професійних програмістів» потім починає вважати себе крутим професіоналом і з’являється усіляке лайно накшталт електрону.

Воно жере ресурси як свиня помиї і фактично перекладає усю відповідальність за комфортну швидкість роботи програм з «професіонала» на користувача, що змушений заради чергового тупого месенджера купувати залізо рівня, трохи нижчого за hi-end.

Це не проблема, це плюс цих мов — люди без досвіду можуть швидко зробити те, що їм потрібно (тому Python номер 1 серед науковців, які не є професійними програмістами).

Спочатку — плюс. Потім — проблема.
Бо наприклад розібратись, чому замість вектора ви отримали ndarray і перевантажена операція робить що завгодно, але не те, що треба, і так кожного дня — може зʼїсти часу і нервів більше, ніж було б втрачено на входження в щось з більшим порогом.

Засіб, який дав більшости непрофесіоналів типу математиків зручність з Python — це навіть не сам Python. Це Jupyter.
Але і він зараз здатний запускати десяток мов, і тут вже тільки легасі (власні досвіди і бібліотеки), що залишається Python, а не R чи щось інше.

І давайте відверто визнаємо, що добрих 90% типових задач для типового користувача може бути вирішено за допомогою цих «умовно повільних» мов.

І 100% може. Але якою ціною?
Python рятують саме бібліотеки знизу і Jupyter згори. Сам він — клей, який для цих задач більше ні на що не здатний — і то виконує свої задачі, мʼяко кажучи, не дуже.

І так, 90% типових програмістів цих типових задач взагалі не розуміють, навіщо існують інші мови.

І різко починають це розуміти у випадках, як вище, коли зневадження так легко написаного коду витрачає весь запас часу;’))
Повірте тому, хто з цим сам бодався:(

Треба визнати, що і в другому випадку теж просто за рахунок зміни мови програмування ви дуже великого приросту продуктивності можете не отримати, а може навіть і уповільнення . Справді, тут йдеться на сам перед про зміну алгоритму, найбільш суттєвий метод пришвидшення програми. Прибирання з рівняння збірки мусора це звісно дуже суттєвий фактор, так само як і JIT інтерпретації але разом з ним додається інші, задля вирішення котрих і вводили попередні алгоритми. А конкретно — фрагментація пам’яті та необхідність ручної низкорівневої оптимізації. Потрібно буде профайлити, виміряти які саме фрагменти програми до них призводять, міняти аллокатори пам’яті тощо. Коротше кажучи, справа не в мові — справа в программістах. От тут якраз, як на мене непогана тема для використання AI.

Але, якщо ваша система повинна збирати дані в режимі реального часу та може загубити ці дані під час «прибирання сміття» чи інших «відволікань» — у вас немає іншого вибору, ніж засісти за C/C++ (або за інші складні та із прогнозованою продуктивністю без відволікань на інші процеси мови).

Ага, ага.
Був такий випадок: іноді (складно передбачити момент) вихід з функції займав секунди 3.
Зʼясувалось: велика структура на декілька гігабайт даних, повʼязаних різними shared_ptr, unique_ptr, weak_ptr і їх аналогами.
Одна фінальна деструкція всього цього мотлоху і молотіння динамічної памʼяти різними delete і free.
Мораль: «если в башне по...нь», C++ не врятує. Якщо в башні норм, і з Java/Python/etc. можна впоратись.

Мораль: «если в башне по...нь», C++ не врятує. Якщо в башні норм, і з Java/Python/etc. можна впоратись.

Я бы сказал что мораль «случаи бывают разные».

В том и дело, что универсальных подходов нет и залагаться на них нельзя. Мой пример был на то, где как раз с более-менее типовым incremental GC, как у современных средств, не было бы жутких неравномерных торможений. Ну и с намёком на то, что мнение, что GC это непредсказуемые тормоза, давно неактуально (в реальности окончательно перестало быть адекватным где-то к 2010).
Тут можно долго вспоминать, например, что Sun изначально делало Java в расчёте на специфику MM в Solaris и просто не успело справиться с популярностью Java после того, как оказалось, что они открыли не просто нишу, а целый ящик Пандоры — а внутренние проблемы не дали возможность быстро с этим совладать. Большинство мифов выросло именно оттуда, ну и плюс LISPовые миры, где до примерно тех же времён за равномерностью временных характеристик не гонялись. Удивительно именно то, как мифы тут проникают между доменами, оставаясь как раз там, где они изначально не имели смысла...

Золоті слова!

Навіть без фотонних акселераторів, код, написаний на Python, вже буває обганяє аналоги на Julia, C++ або Rust.

Звісно, саме тому

Більшість Python-бібліотек написані на C чи Fortran.

Пайтон не повільний бо всі пайтонівські бібліотеки написані на сішці розумними людьми %)
На цьому можна розходитись.

Що ж, виглядає так, що С не вмре і робота буде.

Python это только скриптинг C бинарника

Пайтон не повільний бо всі пайтонівські бібліотеки написані на сішці розумними людьми %)

Ще цікавіше — scipy використовує BLAS, поставка якого в багатьох дистрибутивах збирається з Fortran-версії :))

так а шо це за єйджизм у заголовку?

Ну, взагалі-то, «ейджизм» тут досить обґрунтований. Переконання щодо того, що справжня швидкодія — то C/C++ або асемблер (або більш сучасні, але настільки ж близькі до «заліза» мови), а от типу скриптові рантайми та інтерпретатори — то за визначенням повільно, притаманні переважно дійсно тим, кому за 40. Бо, як власне й пише автор, ми починали вчитися програмуванню у часи, коли власне так і було :)

Я так понимаю, в этих тестах «классический» интерпретируемый Python. Интересно бы посмотреть на результаты аналогичного теста с применением того же CPython / PyPy (было бы интересно потестировать и на Codon, но это, по сути, отдельный язык, хоть и очень близкий к Python).

В целом, «числодробильные» задачи — совсем не то, для чего создавались скриптовые языки (рвущимся написать про numpy и т.п. сразу скажу, что, в этом случае, Python выступает не более, чем «дирижёром» вычислений).

Другое дело, что лет 20 назад скриптовые языки были медленными даже для тех задач, которые не являются вычислительно сложными, что и наложило определённый отпечаток в плане снисходительного отношения к ним.

CPython это и есть классический интерпретатор. Наверно, вы имели в виду Cython.
PyPy одна из моих прошлых работ активно использует — но не для числодробилок, а для всяких сетевизмов, преимущественно с текстовыми протоколами. Ускорение от CPython раза в 3.

Другое дело, что лет 20 назад скриптовые языки были медленными даже для тех задач, которые не являются вычислительно сложными, что и наложило определённый отпечаток в плане снисходительного отношения к ним.

Как раз 20 лет назад скриптовые языки были «на коне» потому что ещё шёл сверхбурный рост (тем же темпом, что у закона Мура) всех характеристик вычислительных систем — производительность, память, скорость интерфейсов и т.п.

А вот уже лет 10 назад началось активное замирание, а сейчас только усугубилось.

Поэтому например 10 лет назад я достаточно положительно относился к Python, а сейчас считаю его антиэкологичной прожорой.

це не ейджизм, це рейт ;)
(так, мене також тригернуло, але потім подумав, що почуття гумору ще ніхто не відміняв, а автор накидав годноти, та й сам на фото десь того віку)

Щодо «годноти» я поспішив...

Звідси docs.exaloop.io/...​codon/general/differences

Strings: Codon currently uses ASCII strings unlike Python’s unicode strings.

не треба так — це ламатиме купу коду у самих неочікуваних місцях

Тобто, Codon — це не компілятор пітона, а компілятор мови, яка дуже наближена до пітона — різниця суттєва

Python не повільний! Щоб це довести ви написали пост в якому розказуєте про кучу штук які роблять Python не таким повільним. Більшість цих штук написана не на Python.

Так питання не в тому ж, щоб прямо порівнювати швидкість Python з чимось іншим. Зрозуміло, що якщо певний алгоритм написати на Python та C++, то код на плюсах буде швидше (та й то не завжди). Питання в тому, чи задовільною є швидкість виконання коду в певному контексті. Python набагато зручніше для написання коду для наукових розрахунків (якщо казати про контекст статті), ніж C++, і якщо швидкість дозволяє, то краще використовувати його. Те, на чому написані використовувані бібліотеки, вже не так важливо.

Що це за нав’язлива дихотомія: py vs cpp? Крім cpp існує ще дюжина різних native-мов, що легко та невимушено розірвуть ваш пайтон як тузик грілку.

А це аргумент навіть не тридцятирічної давнини, а взагалі допромислової епохи. Це для того щоб зробити швидке лоша треба швидкого коня і швидку кобилу. А для того щоб зробити швидкий автомобіль чи літак, потрібні машини які геть не схожі на автомобілі чи літаки.

Clang (саме Сі) написаний на С++. GCC++ (C++) написаний на Сі. Чи це якось характерізує імплементації або тим більше мови? Аж ніяк.

А от CompCert © написаний на Coq (Gallina), який написаний на OCaml. Це якось характерізує Сі, Gallina чи OCaml з точки зору швидкодії чи навіть «зручності» для імплементації компіляторів? Знов ні. Але завдяки Coq, CompCert має цікаву властивість, якої було б непросто досягнути іншим інструментом. Це формальна веріфікація. Це перший і єдиний компілятор Сі, який, з точністю до специфікації, звісно, не міскомпілює.

А мораль тут така, не тримайтесь за упередження, обирайте інструмент під задачу — і все у вас вийде.

Ну хіба що в тому ж сенсі, що і «Война і мір» написана французською.

.../gcc-12.2.0$ find -iname «*.c» | wc -l
134199

.../gcc-12.2.0$ find -iname «*.cc» | wc -l
19045

.../gcc-12.2.0$ find -iname «*.cpp» | wc -l
510

І це з тестсьютами.

gcc.gnu.org/gcc-4.8/changes.html

GCC now uses C++ as its implementation language. This means that to build GCC from sources, you will need a C++ compiler that understands C++ 2003. For more details on the rationale and specific changes, please refer to the C++ conversion page.
А це аргумент навіть не тридцятирічної давнини, а взагалі допромислової епохи. Це для того щоб зробити швидке лоша треба швидкого коня і швидку кобилу. А для того щоб зробити швидкий автомобіль чи літак, потрібні машини які геть не схожі на автомобілі чи літаки.

Якісь надумані аналогії. Я не про коней та літаки писав. Якщо писати вашою ж мовою то python це жигуль. Швидкості жигуля для деяких водіїв не достатньо. Ці водії ставлять турбо наддув і міняють коробку та підвіску. Це зробить конкретну жигу швидкою. Але ніхто не буде казати що жигуль швидкий тому що в нього можна всього напхати.

А мораль тут така, не тримайтесь за упередження, обирайте інструмент під задачу — і все у вас вийде.

Ти диви який пихатий. Мораль тут така що трохи зменшіть почуття власної важливості.

Підписатись на коментарі