Чи часто не використовувати бібліотеки для стандартних числових алгоритмів, і чому?


54

Багато наукових чисельних алгоритмів (інтеграція, диференціювання, інтерполяція, спеціальні функції тощо) доступні в наукових бібліотеках обчислень, таких як GSL . Але я часто бачу код із "рулонними" реалізаціями цих функцій. Для невеликих програм, які не обов'язково призначені для публічного розповсюдження, чи є загальною практикою серед науковців-обчислювачів просто застосовувати чисельні алгоритми (під якими я маю на увазі копіювання чи переписування з веб-сайту, числових рецептів тощо), коли вони вам потрібні? Якщо так, чи є конкретна причина уникати посилань на щось на кшталт GSL, чи це просто більше "традиція", ніж щось інше?

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


Забув згадати: я спеціально запитую про C і C ++, на відміну від мов, таких як Python, де явна перевага (швидкість виконання) від використання бібліотеки.


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

2
Ви дорікаєте кожну теорему, яку ви зустріли? Можливо, ви даєте йому можливість пограти і пограти з дітьми, але якщо це не фокус вашого дослідження, ви, мабуть, приймаєте це і продовжуєте життя.
dls

3
Фізики не є програмістами, і вони не звикли мати справу з кодом інших людей (читати його чи виправляти). Коли їм доводиться використовувати чужий код, часто це не дуже добре написаний або добре коментований код, написаний іншими фізиками, знову додаючи ідею, що краще переписати його, ніж повторно використовувати. Це справедливо принаймні в деяких сферах / громадах, але ставлення змінюється серед молодих людей. Але це не все погано, подумайте про погане ставлення студента CS, який не може щось зробити, якщо не може знайти для цього достатньо простої бібліотеки.
Szabolcs

Відповіді:


45

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

  • Код, перевірений сотнями / тисячами / більше користувачів
  • Код, який надалі буде оновлюватися та вдосконалюватися в майбутньому, без жодної роботи з вашого боку
  • Оптимізований код, який є більш ефективним і, можливо, більш масштабованим, ніж те, що ви написали б у першій спробі
  • Залежно від бібліотеки, встановивши інтерфейс до неї у своєму коді, ви можете отримати доступ до багатьох алгоритмів, якими ви зараз не користуєтесь, але можете захотіти в майбутньому

В останньому пункті вище, я думаю про великі бібліотеки, такі як Trilinos або PETSc . Я можу підкріпити це декількома конкретними особистими прикладами в розробці PyClaw . Хоча було б просто паралелізувати Clawpack з MPI-дзвінками, ми вирішили використовувати PETSc. Це дозволило нам обмежити паралельний код у пакеті менш ніж на 300 рядків Python, але ще краще, розмістивши наші дані у форматі PETSc, ми отримали негайний доступ до неявних вирішувачів PETSc, що дозволяє поточній роботі над неявним вирішувачем у PyClaw. Як другий приклад, PyClaw спочатку включав реконструкцію WENO п'ятого порядку, але ми врешті вирішили покластися на PyWENOпакет для цього. Це було величезним виграшем, оскільки PyWENO може автоматично генерувати підпрограми WENO будь-якого порядку на кількох мовах.

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


5
"Ви можете зробити свій внесок, розробляючи вдосконалення або знаходячи помилок, що принесе користь багатьом іншим людям." - це задовольнило б і потяг до "майстерності / навчання", і лінь (не потрібно робити те, що вже було зроблено). :)
JM

1
Дивіться також крайові корпуси. Для багатьох алгоритмів банально реалізувати щось, що "працює", але не обробляє деякі крихітні підрозділи випадків правильно. Це може бути нормально для одноразового невеликого проекту, але я не можу підрахувати, скільки разів мене зачепили патологічні стани на щось, що я "оптимізував" сам.
meawoppl

34

У зв'язку з функцією бібліотеки є значна накладні витрати програміста, особливо якщо ця бібліотека новачка для програміста. Часто простіше просто переписати прості алгоритми, а не з'ясувати специфіку певної бібліотеки. Коли алгоритми стають складнішими, така поведінка перемикається.

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


19

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

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

А тепер уявіть, що у вас виникає потреба в певному інструменті, який не знаходиться в тій ланцюжку інструментів (це трапилося зі мною минулого місяця). У вас є три варіанти

  1. Згорніть свою власну. З усіма ризиками та клопотами, які пов'язані з цим.
  2. Викресліть десь код із бібліотеки і включіть його в проект. Це означає, що вам доведеться продовжувати технічне обслуговування, і що вам доведеться зрозуміти чийсь код, коли це станеться.
  3. Заходьте до людей, які підтримують ланцюжок інструментів, благайте їх про необхідне, а потім чекайте циклу випуску, щоб отримати його. Ці хлопці досить чуйні, але вам доведеться зробити це для цього без робочого коду або після того, як ви зробили (1) або (2).

Вибрати дуже просто (1). Можливо, занадто просто.


Так, додані залежності є суттєвим недоліком використання бібліотек.
Девід Кетчесон

Залежності є великим недоліком і в моїй свідомості
Фоміт

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

* ваш пункт 3. (Вибачте за
нітпік

Е ... ні. Це говорить про те, що я маю на увазі.
dmckee

12

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

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

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

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


12
"Але, звичайно, вам дійсно потрібно знати, що ви робите: навіть прості алгоритми можуть бути складними у здійсненні". - цього не можна підкреслити достатньо.
JM

10

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

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

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


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

8

Одна з відповідей полягає в тому, що числовий код має стільки невеликих варіацій, що його важко зафіксувати в бібліотеці. Візьміть це порівняно з веб-програмним забезпеченням, яке часто легко встановити і має чіткий набір входів і виходів. Я думаю, що більш поширеним є те, що люди захоплюють рамки або велику бібліотеку, яка діє як рамка (Trilinos / PETSc), і використовують цю екосистему, щоб отримати переваги від використання кодів спільноти.


7

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

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

(Інша річ, що варто подумати: скільки реінструкції потрібно буде зробити, щоб скористатися бібліотекою? Якщо людино-години, які ви витратили на виправлення коду, не компенсуються відповідними прирістками ефективності чи чисельною точністю, можливо, це не стане В ідеалі, однак, це те, що ви плануєте, спочатку розробляючи структури даних та алгоритми, щоб "потік" бібліотеки враховувався з нуля.)


6

Мої 2 копійки.

Я думаю, що про це взагалі простіше писати, ніж просто про C / C ++. По-перше, бібліотеки на таких мовах, як Python, не обов'язково використовуються для отримання швидкої вигоди, навіть якщо це є наслідком. Я думаю @David досить добре висвітлював причини.

Беручи це зверху, мовна реалізація певною мірою диктує, до яких бібліотек ви маєте доступ. Найчастіше використовувані мови в обчислювальній науці включають C, C ++, Python, Perl, Java, Fortran та R. Менш поширеними прикладами можуть бути Ocaml та Common Lisp. Тепер, оскільки більшість цих мов написані на C, вони мають природний інтерфейс зовнішньої функції до C. Однак, не так просто викликати, скажімо, бібліотеку Perl з Python чи навпаки. Тож на практиці люди прагнуть до будь-якого

  1. Використовуйте бібліотеку, написану мовою їхньої реалізації, звичайно те, що є частиною стандартних бібліотек або іншим чином широко доступним, або

  2. Виклик бібліотеки C / C ++ через мови FFI. Це передбачає, що обгортку вже не існує, оскільки, якщо вона є, її не легко відрізнити від (1).

(2), як правило, важче, тому що вам доведеться самостійно обгортати функцію C / C ++. Також вам доведеться або зв'язати бібліотеку, або додати додаткову залежність. З цієї причини люди швидше використовують вбудовані бібліотеки мов, а не використовують GSL, наприклад, на C.

Скажімо, для дуже загальних процедур, скажімо, генерування випадкових зразків з розподілів або основних числових процедур, таких як квадратура інтегралів, легко і звичайно повторно використовувати деяку бібліотеку. Оскільки функціонал, який намагається реалізувати, стає складнішим, він стає експоненціально більш маловірогідним, що хтось буде шукати точну функцію, яку хочеться в іншій бібліотеці, і навіть, як це зробити, можна було б витратити багато часу на пошук і, нарешті, адаптувати функцію як Необхідно (наприклад, стиль / дизайн коду може бути проблемою). Як вже було сказано вище, кожен має доступ лише до підмножини бібліотек. З іншого боку, реалізація алгоритму, якщо він складний і не є основним напрямком, може бути непростим, і, звичайно, доводиться стикатися з цими неприємними питаннями швидкості.

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

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


6

Якщо подумати про свій курс механіки на другому курсі, мені здається, що частиною причини, за якою я реалізував власні версії відомих алгоритмів, є те, що мене вчили робити це саме так. Я не можу придумати жодного прикладу, де мене навчали, як інтерфейсувати та зв’язуватись у бібліотеці в моїй нижчій фізичній освіті. У мене є приємна пам'ять, коли я вперше побачив список координат обертового м'яча для гольфу, обчисливши рішення сполучених рівнянь Ньютона в FORTRAN сам. Існує певна трепет і задоволення (навіть гордість), які випливають з обчислення речей з нуля.


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

5

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


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

Я згоден, це чудове рішення, і люди повинні робити, якщо це можливо.
mhucka

5

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

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


3

На додаток до всього, що вже було сказано вище, я повторю свою відповідь на запитання "Fortran vs C ++": Найцінніший актив програміста - це її час. Так, зовнішні залежності часто незручні. Але витрачати час на повторну реалізацію, налагодження та тестування алгоритмів, які вже реалізували інші, майже завжди нерозумно, і результат також рідко буде таким же хорошим, як код, який написали експерти з певної теми. Повторно використовуйте те, що зробили інші!


Я даю власну відповідь на цю тему. Ви можете дізнатися набагато більше, переписавши всі деталі. Я працюю вже 5-6 років із точковими хмарами. Перші три роки я сам писав усі функції. Другу половину я провів за допомогою Cloud Cloud Library. Я не можу довести, але вважаю себе сильнішим експертом у галузі PCL, маючи перші три роки, витрачені на роздуми над рішеннями, які інші вже запропонували.
Ян Хакенберг

@JanHackenberg - так, але дозвольте мені також бути тупим: ви лише витратили три роки свого життя, переосмисливши колеса. Уявіть, скільки нового ви могли б зробити, якби використовували те, що робили інші !?
Вольфганг Бангерт

Я вирішив писати на Java на своєму першому курсі, оскільки в цей час я вважав свої навички програмування (а не теорії з інформатики) близькими до нуля. Ява все ще була мовою, яку я найкраще практикував. Я також вважав Java хорошим вибором через просту підтримку декількох платформ. Я вступив на крісло без інформаційної підтримки в PhD (традиційне лісове господарство). Я перестрибнув на c ++, коли зрозумів свою помилку і зміг (після публікації, не раніше).
Ян Хакенберг

До речі, я не погоджуюсь, витрачаючи 3 роки свого життя. Це означало б, що я мав лише два корисні роки роботи в докторантурі. Сьогодні я можу помістити 10 мільярдів балонів у хмару лісової точки і дозволити машині вирішити, які гарні зображення для дерев. Мої ~ 50 користувачів також можуть це зробити. Через ~ 1 годину. Всі хитрощі я навчився, вивчивши важкий і трудомісткий спосіб. Я вирішив ніколи не вчитися використовувати vi, але коли люди, які проходять необхідну криву навчання, заявляють, що вони використовують найефективніший спосіб створення коду, я їм вірю.
Ян Хакенберг

2

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


2

"Повторне використання - це насамперед соціальне явище. Я можу використовувати чуже програмне забезпечення за умови, що це

  1. це працює
  2. це зрозуміло
  3. вона може співіснувати
  4. він підтримується (або я готовий його підтримувати сам, здебільшого я не є)
  5. це економно
  6. Я можу його знайти.

"- Б. Струструп, Мова програмування на C ++ 2 видання (1991), с. 383.


1

Інші вагомі причини були дані для використання бібліотек, а також для прокатки власних процедур.

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

Звичайно, багато що залежить від конкретного додатку та скільки разів буде викликана рутина бібліотеки. Чому б ви називали бібліотечну процедуру для функцій Бесселя в мільярди разів, якщо вам потрібно лише кілька значущих цифр для невеликого діапазону x, а якась більш проста техніка буде достатньо для ваших потреб?


0

Мало додати, нам доведеться повторно використовувати код, мова йде про стійкість коду та внесок у суспільство, але це все вище.

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

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

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

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


-1

Алгоритми бібліотек забезпечують на відміну від власних реалізацій:

  • Вони родові та шаблонні. Пізніше ви можете повторно перемежувати свою реалізацію, не турбуючись про зміну власного коду, який, як передбачається, має багато обмежень.
  • Існує економія порівняно із виродженими випадками вхідних даних. Багато алгоритмів обчислювальної геометрії, наприклад, опуклі корпусні, повинні обробляти, наприклад, колінеарність трьох точок. Ви можете ігнорувати ці випадки, якщо ви ніколи не плануєте поширювати свій код, а також не хочете часто використовувати його в майбутньому.
  • Вони забезпечують мінімальну складність виконання для очікуваної або гіршої конфігурації вводу. Алгоритми вищого рівня є алгоритмами, що будують цегли, часто алгоритмами нижчого рівня, наприклад алгоритмами сортування, або спеціальними типами даних. Швидке сортування може бути найпоширенішим вибором для сортування даних, але якщо ваша реалізація алгоритму повинна гарантувати n (log (n)), ви не можете його використовувати.
  • Вони ефективні з використанням пам'яті
  • Вони додатково оптимізовані
  • Якщо він підтримується, набагато більш закритим, щоб взагалі не було "помилок", особливо якщо ви працюєте з основною гілкою. Ніщо не є більш перевіреним, ніж добре розподілена бібліотека. Не кожна помилка виходить з ладу, не кожна помилка дає необґрунтовані результати. Реалізація алгоритму може все-таки дати прийнятні результати, не такі хороші, як призначені. Чим менше бачна помилка, тим менше ймовірність, що ви як одна людина навіть можете її виявити.

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

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

Якщо ви самостійно і хочете поширювати, є ще одна проблема. Я вважаю, як і багато інших вихідний код, як найбільш корисний ресурс. Тут можуть погодитися багато хто з усіх інформатиків. У застосованому полі поза інформатикою може знадобитися забезпечити попередньо складений файл, виконаний на Windows. У Linux можна налаштувати порівняно легко речі у разі використання бібліотек з відкритим кодом.

Перезапис алгоритму самостійно дає свободу відвідуванню. Ваш проект може не підтримувати GPL- офіс GSLНаприклад, .

Ліцензія може бути єдиним обмеженням, яке не залежить від точки зору шукачів.


1
Нерозумно думати, що "реалізація алгоритму самостійно" та "засвоєння [сингл] бібліотечного синтаксису" "коштуватимуть стільки ж часу". Це не вірно навіть для простих функцій, таких як "strcat". Це, безумовно, не так, наприклад, у LAPACK або в бібліотеках вищого рівня.
Вольфганг Бангерт

@WolfgangBangerth Дякую за відгук. Я перечитав те, що написав, і не хотів передавати повідомлення про те, що власні реалізації можуть бути конкурентними. Але я так багато навчився. Моє "обоє могли коштувати два тижні" було не гарним прикладом. Власне кажучи, це коштувало мені востаннє "вивчати синтаксис" через 2 тижні, коли я перейшов з Java на C ++, і в цей час я також вивчив базовий синтаксис C ++. Я більше боровся з Покажчиками, а потім зі своєю новою бібліотекою. Два тижні на будь-якому з моїх реалізованих алгоритмів, можливо, було кодування часу, що було моїм незначним вкладенням (читання книг раніше займало набагато більше часу).
Ян Хакенберг

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

@WolfgangBangerth Я погоджуюся з усіма вашими аргументами. Мій єдиний пункт полягає в тому, що ви дізнаєтесь набагато більше теорії, коли вам потрібно самостійно обробляти ці кутові справи. Моя перша версія моєї відповіді справді звучала так, ніби це не має ніякого значення. Я був жахливо стомлений. У вдосконаленій відповіді я пишу набагато більше про переваги стабільності бібліотек. Для мене це компроміс між витраченим часом та заробленими знаннями.
Ян Хакенберг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.