Англійська для розробників Julia

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

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

Ключовий словник

** Multiple dispatch ** — модель вибору методів Julia, за якої конкретний метод, який буде запущено, обирається на основі типів виконання всіх аргументів функції, а не лише першого з них, як у типовому об’ єктно- орієнтованому методі одноразового запиту. “Ми не потребували шаблон відвідувача тут — декілька відправ автоматично вибирають правильний метод collide на основі типів обох об’ єктів, що передаються.”

** Компіляція за принципом « просто вчасно » (JIT) ** — підхід Julia до компіляції кожного методу до рідного машинного коду під час першого виклику з певною комбінацією типів аргументів, саме тому перший виклик є повільнішим за пізніші. “Це перше викликання було повільним через компіляцію JIT — після того, як воно буде скомпільовано для цих типів аргументів, кожне наступне викликання буде виконуватися на рідній швидкості.”

** Стабільність типів ** — властивість функції, за якої тип її поверненого значення можна визначити лише за типами її вхідних даних, що дозволяє компілятору створювати швидкий, спеціалізований код замість повернення до повільнішого загального коду. “Ця петля була повільною, тому що функція не була типово стабільною — вона іноді повертала Int і іноді Float64, тому компілятор не міг її спеціалізувати.”

** Broadcasting (синтаксис з крапкою) ** — позначення ., яке застосовує функцію або оператор елемент за елементом до масивних даних, автоматично обробляючи розмір і форму без явного циклу. “Замість циклу над масивом, просто використовуйте трансляцію — sqrt.(values) застосовує sqrt до кожного елемента в одному злитті, без розподілу пропуску.”

** Передкомпіляція пакунка** — крок, під час якого код пакунка Julia буде компіловано заздалегідь і кешовано на диску, зменшуючи затримку « часу до першого графічного представлення », яка раніше спричинила повільність інтерактивних сеансів. “Перекомпіляція пакунків є причиною того, що другий раз, коли ви завантажуєте цей пакунок у сеансі, це відбувається майже миттєво, замість тридцяти секунд.”

Звичайні фрази

  • Чи це повільно через JIT компіляцію, чи це насправді повільно кожен раз?»
  • Чи можемо ми вирішити це з множинною відправкою замість великого if-else ланцюга на типі?»
  • Чи є ця функція стабільною, чи повертає вона різні типи залежно від вхідних даних?
  • Чи варто нам використовувати broadcasting тут замість написання explicit для loop?
  • «Чи дійсно завершилася передкомпіляція пакунків, чи ми все ще вдаряємо по компіляції першого виклику?»

Приклади висловлювань

Пояснення проблеми з швидкодією співробітнику команди: “Еталон виглядав погано тільки через JIT компіляцію на першому виклику - як тільки ми розігріли його, він збігався з нашим вручну оптимізованим кодом C.”

Перегляд запиту на звантаження: “Перебудуйте це так, щоб воно було стабільним за типом — зараз воно повертає Any в одній гілці, що тихо вбиває швидкість для всієї функції.”

Навчання новичка Python: “Замість написання циклу з for i in range(len(x)), використовуйте broadcasting — y .= f.(x) є ідіоматичною Julia і зазвичай швидшою.”

Професійні поради

  • Використовуйте multiple dispatch, коли пояснюєте дизайн Julia розробникам мов з однією відправкою — це переформулює, що «поліморфізм» навіть означає в цій екосистемі.
  • Завжди відрізняйте час розігріву ** JIT- компіляції ** від швидкодії у стабільному стані під час вимірювання — порівняння першого виклику з розігрітим викликом є класичною, вводячою у оману помилкою.
  • Діагностуйте несподівану повільність, спочатку перевіривши стабільність типів — вивід @code_warntype, що показує типи Any, зазвичай є причиною.
  • Рекомендується ** broadcasting ** над ручними петлями для операцій з масивами — це більш ідіоматичне і, як правило, швидше завдяки злиттю петель.

Практичні вправи

  1. Пояснити багаторазове відправляння і те, як воно відрізняється від одноразового відправляння в об’ єктно- орієнтованих мовах.
  2. Описати, чому перший виклик функції Julia часто є набагато повільнішим за наступні виклики, і що слід перевіряти перед тим, як завершувати виконання самої функції.
  3. Напишіть речення, у якому поясните, чому функція нестабільного типу погіршує швидкодію, навіть якщо Julia динамічно типізується.

На практиці: Навігація Nuance - професійна комунікація для розробників Julia

Основні концепції Julia — багаторазове відправляння, стабільність типів і її дивовижні характеристики продуктивності — часто є викликом для чіткого вираження при спілкуванні з колегами або зацікавленими сторонами, які можуть не мати глибокого розуміння системного програмування. Легко впасти в технічний жаргон, який затьмарює ваше значення, а не прояснює його. Для не-рідних англомовних носіїв, це особливо важливо; точність у фразування може суттєво вплинути на розуміння і співпрацю. Просте нерозуміння того, * чому * за вибором дизайну Julia може призвести до розчарування або опору під час перегляду коду, обговорення можливостей, або навіть при поясненні роботи нової бібліотеки.

Розглянемо типовий сценарій: ви витратили багато часу на оптимізацію функції за допомогою можливостей декількох розсилок Julia, що призвело до значного поліпшення швидкості. Під час перегляду коду ваш колега коментує: « Це виглядає… складно. Чи можете ви пояснити, чому ви визначили так багато правил розсилки? » Проста відповідь на зразок « Я використовував декілька правил розсилки для оптимізації продуктивності » не допоможе. Замість цього, потрібне більш професійне і нюансове пояснення. Ви можете сказати щось на зразок: « Я використовував багаторазове відправляння, щоб використати здатність Julia вибирати найефективнішу реалізацію на основі конкретних типів вхідних даних. Визначаючи ці правила, ми фактично дозволяємо компілятору інтелектуально вибирати оптимальний шлях для виконання — ключовий фактор у досягненні цього поліпшення швидкості. ” Зауважте, як формування його як * можливості * мови (використання) і опис * механізму * (вибір компілятора) робить його більш доступним.

Інша поширена ситуація виникає при обговоренні продуктивності з кимось, хто не знайомий з компіляторними мовами. Вони можуть запитати: « Як Julia може працювати так швидко, якщо вона динамічно вводиться? » Відповідь тут має бути спрямована на помилкове уявлення, що динамічне введення по суті прирівнюється до повільності. Ви можете сказати щось на зразок: «Поки Julia динамічно типізується — тобто ми не декларуємо типи повсюди — її стабільність типів і складні оптимізації компілятора дозволяють значно підвищити продуктивність. Компілятор може аналізувати код під час виконання і приймати рішення про те, як найкраще його виконати, часто подібно до того, як JIT (Just- In- Time) компілятор працює в інших мовах.» Підкреслення * стабільності * є ключовим; це не просто випадкове виконання.

Нарешті, при написанні описів PR, чіткість є найважливішою. Замість простого повідомлення «Покращена продуктивність», розгляньте щось на зразок: «Рефакторизовано конвеєр обробки даних для використання множинної відправки і стабільності типів, що призвело до 30% скорочення часу виконання для великих наборів даних. Це було досягнуто шляхом ретельного визначення правил відправки на основі типів вхідних даних, щоб забезпечити оптимальний вибір шляху під час компіляції. ”

Ось приклад використання BenchmarkTools.jl для вимірювання швидкодії:

using BenchmarkTools

@btime it=$(function f(x) end; x=1000)
@btime it=$(function g(x) end; x=2000)

Поширені запитання

Про що ця стаття "Англійська для розробників Julia"?

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

Чи безкоштовна ця стаття?

Так. Усі статті на CoderSlingo, включно з цією, доступні безкоштовно без реєстрації.

Скільки часу займає читання "Англійська для розробників Julia"?

Приблизно 7 min.