LINUX.ORG.RU
ФорумTalks

Какой инструмент правильнее подойдёт для решения задачи?

 , ,


0

3

Хочу писать небольшие программы, компенсирующие недостаток функционала у ПО, с которым работаю, ну и соответственно глубже погрузиться в теорию. Решать предстоит задачи близкие к математике, к примеру для набора данных выполняется преобразование Фурье, далее вычисляется медианная амплитуда для каждой частоты, после чего вычисляется медиана для этих медиан и полученный фактор можно использовать для выявления аномальных значений. Данные могут быть довольно большого объёма. Также необходима возможность рисовать 2D графику для отображения данных и результатов расчётов.

Я читал много тем на этом форуме и понял, что нет идеального ЯП, подходящего для любой ситуации, а потому решил создать эту тему и спросить, что лучше подойдёт для решения таких задач С или С++, а может быть Java? Эти языки были выбраны мной как варианты в силу их высокой производительности. Java, конечно, несколько медленнее, но в ней уменьшены такие возможности «выстрелить себе в ногу», как ручное управление памятью, выход за границы массива, UB и прочие «пугалки». Кроме того, есть тулкиты для работы с графикой, написанные на этих языках (или для них?).

Но, пожалуй, самым главным вопросом для меня является вопрос приобретённых навыков. Меня всегда интересовало программирование и если что-то случится и я не смогу найти работу по своей специальности, то хочется пойти не в дворники, а в сферу программирования пусть даже с самых низов, но даже для этого неплохо обладать хоть какими-то знаниями и навыками.

Вышеописанное слабо связано с linux, потому добавлю, что рад буду советам какую ide (какой редактор + плагины) с поддержкой linux стоит попробовать, а так же какую литературу почитать.

Ответ на: комментарий от Stahl

Ему точно не нужен язык общего назначения, а именно что спецпакет.

cnupm
()
Ответ на: комментарий от Stahl

На прошлой работе тесно сотрудничал с математиками, они сначала обкатывали алгоритмы в Matlab, затем переписывали на С. Так что язык общего назначения, наверное, всё-таки нужен.

flyshoot
() автор топика
Ответ на: комментарий от StReLoK

Только не садись за пистон.

Связка matplotlib+numpy+scipy отлично подходит для решения большинства расчетных задач. По крайней мере, ты можешь сосредоточиться на задаче, а не бороться с языком в попытках не отстрелить себе ногу.

hippi90 ★★★★★
()

Я читал много тем на этом форуме и понял, что нет идеального ЯП, подходящего для любой ситуации

одназначна нобелевку.

mos ★★☆☆☆
()
Ответ на: комментарий от hippi90

На пистоне как раз таки можно поломать себе каждую кость в ноге по отдельности. Одни пробелы вместо табов чего стоят. А уж циклы со своими отступами вообще доставляют неземное удовольствие.

StReLoK ☆☆
()

Python3+matplotlib+numpy+scipy плюсую. Нафиг C/C++/Java в общем случае. В частностях берешь C/C++ для тех случаев, где Python библиотека не покрывает потребности.

В случае удовлетворения собственного желания «побыстрее» используй Intel® Distribution for Python. Хотя и обычный сойдет.

Deleted
()

С++ (т.к. с него всегда можно перейти в си, при желании (если конечно все не слишком завязано на ооп)), но есть шанс получить более быстрый код чем на си (за счет встраивания функторов [std::sort например работает быстрее чем c qsort]) и вычислений вовремя компиляции как конкретных значений, так и и выражений (т.е. грубо говоря упрощений математических выражений например с рекурсивных (в исходном коде) в итеративные (в бинарном коде времени выполнения), причем более короткие, и все это не руками а компилятором (http://cpp-reference.ru/articles/expression-templates/).

«стрельба в ногу» это слухи от тех кто не обладает должным уровнем внимательности и усидчивости чтобы контролировать ресурсы и типы с которыми он работает.

В общем главное не на медленных языках, хватит уже медленного кода, который жрет память. Приходится работать с некоторыми программами, написанными на джава, жаль что сейчас в тренде тяп-ляп и готово а не вдумчивое программирование.

bonta ★★★★★
()
Ответ на: комментарий от mittorn

Matlab или python удобно использовать для реализации какого-то алгоритма, но ведь потом надо будет переписывать на языке общего назначения для удобства использования и повышения производительности.

flyshoot
() автор топика
Ответ на: комментарий от StReLoK

На пистоне как раз таки можно поломать себе каждую кость в ноге по отдельности. Одни пробелы вместо табов чего стоят. А уж циклы со своими отступами вообще доставляют неземное удовольствие.

По сравнению с С++ писать на питоне просто и приятно. Выделение блоков отступами вообще не мешает, один фиг за тебя это IDE/редактор делает. Хотя если мсье предпочитает писать код в блокноте, то не надо перекладывать с больной головы на здоровую.

hippi90 ★★★★★
()
Ответ на: комментарий от flyshoot

Смысла нет переписывать. Работает на Python? Пусть работает и дальше. Интерфейс на том же PyQt прикрутить можно и ладно. Если переписывать на «язык общего назначения», есть вероятность, что проект сдохнет раньше (потеряет аудиторию), чем его перепишут.

Deleted
()

Если возьмешь С, С++ или Java (или даже Fortran, как советуют выше в теме), то будешь тратить время на борьбу с языком и своим говнокодом, который неизбежно будешь писать поначалу, вместо того, чтобы решать задачу предметной области. Но, если не бросишь все это дело, можешь стать высокооплачиваемым программистом.

Если возьмешь спецпакет вроде Matlab, то сможешь проще решать задачи предметной области, но программы (и, отчасти, полученные навыки) будут жестко привязаны к этому пакету. Программу будет сложнее для распространения и эксплуатации третьими лицами, даже если пакет опенсорсный

Так что наверное лучший вариант это matplotlib+numpy+scipy, как уже посоветовали выше

annulen ★★★★★
()
Ответ на: комментарий от flyshoot

потом надо будет переписывать на языке общего назначения для удобства использования и повышения производительности.

Вот когда упрешься в производительность, тогда и будешь об этом думать. Numpy и Scipy внутри на C/Fortran написаны, всё там нормально с производительностью.

hippi90 ★★★★★
()
Ответ на: комментарий от flyshoot

потом надо будет переписывать на языке общего назначения для удобства использования и повышения производительности.

Потом все равно придется переписывать, независимо от производительности. Поверь мне :)

annulen ★★★★★
()
Ответ на: комментарий от Stahl

Во-во, в том же матлабе всё это делается в несколько строчек. И GPU Acceleration имеется, чтобы не считать огромные массивы данных на CPU. Но под хотелки автора не очень подходит, т.к. специализированные языки редко нужны работодателю.

Sadler ★★★
()
Ответ на: комментарий от annulen

Если возьмешь спецпакет вроде Matlab, то сможешь проще решать задачи предметной области, но программы (и, отчасти, полученные навыки) будут жестко привязаны к этому пакету.

Об этом я и думал, я видел математиков, которые хорошо разбираются собственно в математике, но плохо в программировании и потому возникают проблемы при переносе на язык общего назначения.

flyshoot
() автор топика

Жабакрипт и ниибет

bender ★★★★★
()

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

flyshoot
() автор топика

Я писал такое (может не совсем такое, но подобное) на C# под винду, на самом деле ЯП не принципиален. Тебе надо решить, будет ли у тебя 3D графика в визуализации и чем ты будешь её рисовать (ну и куда будешь пихать свое поделие). Java не сильно медленнее, у Java медленный запуск программы (долго стартует виртуальная Java машина, оптимизирует и загружает код). Да, можно конечно повозиться с матлабом, но мне проще столь простую задачу сразу на высокоуровневом ЯП бахать. Всё равно математики у тебя мало (как ты описал), буквально сотня строк кода, если ты даже про погрешности не думаешь. Если код для Linux-а и данных реально много (скажем пара ТБ), то я бы выбрал C/C++, (Cairo + Gtk)/Qt. Но мне код писать на том же C# гораздо проще, чем вспоминать матлаб.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Ну, вначале будет мало математики, да, но далее я думал погрузиться в решение обратных задач. Данные бывают разного объёма но 100-200 Гб это уже норма и есть подозрения, что объёмы будут расти со временем, алгоритмы также бывают разные(до сложных мне, конечно, далеко), какие-то задачи считаются за несколько часов, какие-то за несколько дней.

flyshoot
() автор топика
Ответ на: комментарий от flyshoot

писать модули с фильтрацией, обратной фильтрацией и более сложными алгоритмами.

Писать ничего ненужно, для твоих задач «дедЫ» уже всё давным-давно написали на Фортране. © :)

quickquest ★★★★★
()
Ответ на: комментарий от Deleted

Python3+matplotlib+numpy+scipy плюсую.

Слышал, что многие математики используют такую связку как альтернативу для матлаба там где это возможно. Но мне хочется начать с решения простой задачи, скажем отображения данных. А когда дойдёт дело до решения какой-то сложной задачи, обязательно вспомню про связку в цитате, спасибо.

flyshoot
() автор топика
Ответ на: комментарий от quickquest

Задача в шапке это просто пример, описание которого занимает не слишком много времени, может я и не буду его реализовывать.

flyshoot
() автор топика
Ответ на: комментарий от flyshoot

но ведь потом надо будет переписывать на языке общего назначения для удобства использования и повышения производительности.

Производительность матлаба в целом весьма высока, т.к. самая затратная часть тулбокса бинарная, написана на каких-нибудь сях, а всё остальное исполняется в той же java. Главное не забыть закомментировать проверку лицензии на модули в некоторых операциях, иначе процентов на 20 снизится производительность.

Sadler ★★★
()

Что касается второй части, то следует ознакомиться с http://pypl.github.io/PYPL.html В расчетах популярен Python (пистон, как его здесь величают), при этом он находит применение и в индустрии софтописания. Java, несмотря на свою популярность и доступность моря готовых библиотек, я бы для решения этой конкретной задачи не рекомендовал. Во-первых, она больше ориентирована на решение enterprise-web задач, во-вторых, как язык она сейчас переживает кризис развития (некоторые вообще считают, что вместо Java будет Scala, а Java можно уже хоронить), да и граблей там много. И с десктопным GUI у Java не очень. На мой вкус для подобных задач отлично подошел бы C++ с GUI на Qt (и по качеству это будет высший класс, если есть опыт и делать всё правильно, и кроссплатформенность будет), но порог вхождения в C++ высокий, а основная сфера его применения достаточно нишевая (сейчас даже десктопные приложения почти не разрабатывают, а если разрабатывают, то используют для этого C# или Swift). С другой стороны в банковской сфере, например, C++ применяется довольно широко (наряду с Java).

asaw ★★★★★
()

к примеру для набора данных выполняется преобразование Фурье, далее вычисляется медианная амплитуда для каждой частоты, после чего вычисляется медиана для этих медиан и полученный фактор можно использовать для выявления аномальных значений. Данные могут быть довольно большого объёма. Также необходима возможность рисовать 2D графику для отображения данных и результатов расчётов.

Вот реализация, чтоб не быть голословным:

data = mean(audioread('vox.wav'),2); 
N=2048; [s,f,t] = spectrogram(data,gausswin(N,3),N/2,N,44100,'reassigned'); 
amps=abs(s); imtool((mag2db(amps)+40)/90.0);
meds = median(amps,2); figure(1); plot(meds); 
mmed = median(meds)

Sadler ★★★
()

Алгоритм решает

Правильный выбор алгоритма гораздо важнее выбора языка.

Camel ★★★★★
()

Бери пистон как тут уже выше написали, java/c++ в принципе хороши, просто в таких условиях, как у тебя, шансы их освоить на высоком уровне и найти работу примерно такие же как стать высокооплачиваемой балериной. Если все же есть желание, бери из них то на чем программируют ближайшие нормальные программисты из окружения.

Tark ★★
()
Ответ на: комментарий от Sadler

Матлаб это классная штука, но мне хочется создать что-то чем смогу пользоваться не только я, вариант выложить что-то рабочее в открытый доступ и получать советы от заинтересовавшихся проектом с опытом программирования, как мне кажется, более верный способ наращивания навыков. Но про матлаб и питон я забывать не собираюсь и когда дойдёт дело до чего-то действительно сложного, сначала обкатаю алгоритм на них, а потом уже буду переносить на язык общего назначения. Спасибо за совет.

flyshoot
() автор топика
Ответ на: комментарий от Tark

Ближайший пишет на C++/Qt. Но питон не буду скидывать со счетов. Спасибо.

flyshoot
() автор топика

Java:

IntelliJ IDEA Ultimate - использовать триальную версию. Раз в месяц обнулять триал. Если интересно как - свяжись со мной

Если не хочется шквариться об триалы, то IntelliJ Community Edition. Можно попробовать Eclipse, но обычно совсем новичкам он кажется слишком сложным.

C++: Microsoft Visual Studio. На гну-линуксе - QtCreator.

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)

Советую приглядеться к комментариям, где хают джаву, и позадавать их авторам элементарные алгоритмические или железячные вопросы, поспрашивать простейшие вопросы про многопоточность и модели работы памяти и процессора. Расспросить как внутри устроены их коллекции, и как работает кэширование в рантайме. И только когда человек сможет нормально отвечать на такие вопросы, слушать что он говорить дальше.

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от flyshoot

Слышал, что многие математики используют такую связку как альтернативу для матлаба

так математикам нужно писать скрипты и смотреть на результат. Потом править скрипт, снова запускать и смотреть на результат

это радикально другая задача, чем писать самостоятельно работающий софт

stevejobs ★★★★☆
()

очу писать небольшие программы, компенсирующие недостаток функционала у ПО, с которым работаю

на каком языке написано ПО с которым работаешь ? вот на том и пиши..

MKuznetsov ★★★★★
()
Ответ на: комментарий от bonta

Что посоветуете почитать по С++? Несколько лет назад читал книгу Дейтелов с введением в С++ и Страуструпа, но не помню которое по счёту издание. Я вижу сейчас уже есть С++14, а скоро будет С++17. Возможно в связи с этим есть более свежие книги с обзором новых возможностей.

flyshoot
() автор топика
Ответ на: комментарий от mittorn

угу C или Fortran, консольное, графику можно на лету в гнуплот выводить

про Matlab не скажу, но Mathematica всё-таки тормозная и жрущая как ни крути когда речь заходит о больших задачах

WerNA ★★★★★
()
Ответ на: комментарий от MKuznetsov

Кто ж его знает, с уверенностью можно сказать только в случае с java. На java написаны две софтины, с которыми я работаю. К одной из них претензий нет вообще, у второй интерфейс любит «залипать» (но это, наверное связано с желанием авторов сканировать кучу больших файлов).

flyshoot
() автор топика
Ответ на: комментарий от stevejobs

Я прочёл Шилдта, написал модуль ввода данных и мне понравилась java, но после прочтения обсуждений на форуме, у меня сложилось мнение, что основное применение java это web и enterprise, то есть навыки, приобретённые при написании прикладных программ, не помогут в трудоустройстве.

flyshoot
() автор топика

Небольшие, юниксвейные утилитки из того что я видел, лучше всего получаются на C. Но для этого надо уметь хорошо писать небольшие юниксвейные утилитки и знать C:)

Если рассматривать в контексте приобретения опыта в популярном яп, с целью найти работу быстро и без проблем и погружений ещё в пару тройку смежных областей, то это однозначно java или python.

Насколько я слышал/видел, учёные предпочитают python,R и каких то студиях типа matlab. Работу в общем случае проще найти на java(но в 90% случаев это будет унылый и кровавый Э). Крутые учёные потом всё равно переписывают свои поделки на C или кресты, однако прототипируют и обкатывают в чём то более малословном и без низкоуровневых деталей.

Вообщем как среднюю по больнице я бы рекомендовал python :) Как минимум хорошо зная его можно податься в devops, что нынче оплачивается зачастую выше чем работа разработчика, однако тоже довольно унылое занятие на мой вкус.

pon4ik ★★★★★
()
Ответ на: комментарий от flyshoot

Как разработчик на c++ - я бы не советовал использовать c++ :)

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

Например - много где хотят что бы ты всё равно знал бы ещё и питон. Т.к. это удобно для прототипирования и тестирования решений. Или навыки многопоточного программирования. В любом случае с тебя потребуют понимание архитектуры эвм на достаточно низком уровне (как и с С кстати). Единственный вариант который прокатит с c++ в твоём раскладе - это пойти потом разрабатывать gui на Qt/qml.

pon4ik ★★★★★
()

Эти языки были выбраны мной как варианты в силу их высокой производительности. Java, конечно, несколько медленнее, но в ней уменьшены такие возможности «выстрелить себе в ногу», как ручное управление памятью, выход за границы массива, UB и прочие «пугалки».

Судя по описанию задачи (программы на один раз, посчитать и всё), тебе вообще должно быть по фигу производительность, ручное управление пасятью, UB и т.д.

Насчёт опыта: становись специалистом в своей узкой области, тогда работу не потеряешь никогда, и если потеряешь - это не страшно. А начинать заново с низов - глупо и не нужно.

Pythagoras ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.