Здравствуйте, De-Bill, Вы писали:
DB>Язык крайне важен. В data science большая большая часть идей, гипотез, подходов не срабатывает, или срабатывает не в том виде, в каком задумывалось. Допустим, мне надо проверить гипотезу. Я могу сделать это в 3 строки на Python, беру и делаю. На C# это заняло бы строк 20-30 со всякими вложенными циклами и подобной хренью, желание проверять гипотезу, которая в 90% случаев окажется неверной, пропадает.
Еще раз -- язык-то тут причем? 2-3 строчки питона -- вызов соотв. библиотек. Тоже количство было бы и на шарпе в случае вызова соотв. библиотек.
S>Еще раз -- язык-то тут причем? 2-3 строчки питона -- вызов соотв. библиотек. Тоже количство было бы и на шарпе в случае вызова соотв. библиотек.
Python как язык позволяет создавать библиотеки уровня pandas. C# нет. Точнее, повторить именно функционал можно было бы, но выглядели бы конструкции его использования ужасно, и пользоваться ими было бы невозможно. Даже для весьма ущербного LINQ разработчикам пришлось расширять язык, и всё равно получилось в разы менее удобно, чем SAS data steps 40 летней давности, а с Python + pandas вообще не сравнить.
Здравствуйте, Sharov, Вы писали:
S>Еще раз -- язык-то тут причем? 2-3 строчки питона -- вызов соотв. библиотек. Тоже количство было бы и на шарпе в случае вызова соотв. библиотек.
И близко не было бы. По твоей логике получается, что много разных языков не нужно: взял один, понаписал библиотек и пользуйся. Но по факту, языков много, их постоянно создают и переходят с одного на другой.
Для примера с Питоном: анализ данных на нём делают как правило в jupiter notebooks. Получается охрененный результат в виде органического сосуществования документации, кода и его результата. Можно поменять ячейку, нажать Enter и она пересчитается — интерактивность на высоте.
Что интересно, jupiter позволяет делать аналогично со многими языками, но выстрелил именно Питон. Почему? Потому что удобен.
Здравствуйте, Nuzhny, Вы писали:
N>И близко не было бы. По твоей логике получается, что много разных языков не нужно: взял один, понаписал библиотек и пользуйся. Но по факту, языков много, их постоянно создают и переходят с одного на другой. N>Для примера с Питоном: анализ данных на нём делают как правило в jupiter notebooks. Получается охрененный результат в виде органического сосуществования документации, кода и его результата. Можно поменять ячейку, нажать Enter и она пересчитается — интерактивность на высоте. N>Что интересно, jupiter позволяет делать аналогично со многими языками, но выстрелил именно Питон. Почему? Потому что удобен.
Я про удобность питона для подобных задач не спорю. Но рано или поздно эти наработки должны уйти в продакшн, или работать на компилируемом языке. И чем тут C# кроме отсутствия библиотек хуже?
Здравствуйте, Sharov, Вы писали: S>Я про удобность питона для подобных задач не спорю. Но рано или поздно эти наработки должны уйти в продакшн, или работать на компилируемом языке. И чем тут C# кроме отсутствия библиотек хуже?
тем что надо на него переписывать?
кому нафиг такое счастье нужно???
Здравствуйте, Sharov, Вы писали:
S>Я про удобность питона для подобных задач не спорю. Но рано или поздно эти наработки должны уйти в продакшн, или работать на компилируемом языке. И чем тут C# кроме отсутствия библиотек хуже?
Прямо сейчас ему явно не хватает кроссплатформенности. Я его плохо знаю, но написание кода должно быть удобно для непрограммистов, математиков или статистиков. Такое возможно? При всей моей любви к С++ я точно знаю, что на нём неспециалист писать не сможет. Можно ли на C# писать в чисто процедурном стиле? Чтобы не думать о классах, их иерархии и архитектуре приложения? Это тоже не нужно. Язык должен быть простым, чтобы на нём могли писать все.
Про нехватку библиотек уже говорили. Кто их будет писать? Или хотя бы удобные биндинги? Например, я использовал OpenCV из С, из С++, из C# (через Emgu CV) и через Питон. В С было слишком многословно и муторно, в С++ удобно, в Питоне очень удобно и кратко, а в С# я испытывал проблемы чисто языковые (вот пример): using, new, бесконечное указание типов матриц. Зачем это?!! Почему в С++ и Питоне всё это не нужно?
Вот кусочек кода:
Bgr[] colors = new Bgr[] {
new Bgr(0, 0, 255),
new Bgr(0, 255, 0),
new Bgr(255, 0, 0)};
Создаётся статический массив из трёх структур. Зачем тут 4 раза вызывается new? Мне непонятно. Да, я не программирую на C#, но такие конструкции выглядят дикостью на фоне современного прогресса в С++. С таким подходом никто в здравом уме пользоваться C# не будет.
Добавлю кусочек из того же примера:
// display the original training samplesfor (int i = 0; i < (trainSampleCount / 3); i++)
{
PointF p1 = new PointF(trainData1[i, 0], trainData1[i, 1]);
img.Draw(new CircleF(p1, 2.0f), colors[0], -1);
PointF p2 = new PointF(trainData2[i, 0], trainData2[i, 1]);
img.Draw(new CircleF(p2, 2.0f), colors[1], -1);
PointF p3 = new PointF(trainData3[i, 0], trainData3[i, 1]);
img.Draw(new CircleF(p3, 2.0f), colors[2], -1);
}
На Питоне примерно также, но можно cv::Point не писать, а отправить туда тупл.
Разница колоссальная и по объёму кода и по идеологии. Не надо создавать точки, создавать окружности и у картинки вызывать метод Нарисовать Окружность. Подход будет: нарисовать Окружность с таким-то цетром и радиусом такого цвета. Как по мне, это логичнее.
Здравствуйте, Nuzhny, Вы писали: N>Здравствуйте, Sharov, Вы писали: S>>Я про удобность питона для подобных задач не спорю. Но рано или поздно эти наработки должны уйти в продакшн, или работать на компилируемом языке. И чем тут C# кроме отсутствия библиотек хуже? N>Прямо сейчас ему явно не хватает кроссплатформенности. Я его плохо знаю, но написание кода должно быть удобно для непрограммистов, математиков или статистиков. Такое возможно? При всей моей любви к С++ я точно знаю, что на нём неспециалист писать не сможет. Можно ли на C# писать в чисто процедурном стиле? Чтобы не думать о классах, их иерархии и архитектуре приложения? Это тоже не нужно. Язык должен быть простым, чтобы на нём могли писать все.
Может. Коллега в отделе математик, написал кучу кода (~20kloc) в процедурном стиле -- работа с матрицами и т.д. Все на C#, в процедурном стиле -- никаких наследований, паттернов и проч. я не видел в коде.
При желании все возможно.
N>Про нехватку библиотек уже говорили. Кто их будет писать? Или хотя бы удобные биндинги? Например, я использовал OpenCV из С, из С++, из C# (через Emgu CV) и через Питон. В С было слишком многословно и муторно, в С++ удобно, в Питоне очень удобно и кратко, а в С# я испытывал проблемы чисто языковые (вот пример): using, new, бесконечное указание типов матриц. Зачем это?!! Почему в С++ и Питоне всё это не нужно? N>Вот кусочек кода:
Скрытый текст
Bgr[] colors = new Bgr[] {
new Bgr(0, 0, 255),
new Bgr(0, 255, 0),
new Bgr(255, 0, 0)};
N>Создаётся статический массив из трёх структур. Зачем тут 4 раза вызывается new? Мне непонятно. Да, я не программирую на C#, но такие конструкции выглядят дикостью на фоне современного прогресса в С++. С таким подходом никто в здравом уме пользоваться C# не будет.
А сколько должно быть new? Можно создать статический конструктор и все сделать в цикле -- синтаксически будет один new. А вообще это дело исключительно привычки.
N>Добавлю кусочек из того же примера:
Скрытый текст
N>// display the original training samples
N>for (int i = 0; i < (trainSampleCount / 3); i++)
N>{
N> PointF p1 = new PointF(trainData1[i, 0], trainData1[i, 1]);
N> img.Draw(new CircleF(new PointF(trainData1[i, 0], trainData1[i, 1]), 2.0f), colors[0], -1);
N> PointF p2 = new PointF(trainData2[i, 0], trainData2[i, 1]);
N> img.Draw(new CircleF(p2, 2.0f), colors[1], -1);
N> PointF p3 = new PointF(trainData3[i, 0], trainData3[i, 1]);
N> img.Draw(new CircleF(p3, 2.0f), colors[2], -1);
N>}
Ну тут явно вопросы к тем, кто портировал api. Оне совершенно разные. При желании код на шарпе тоже можно в три строчки написать -- заинлайнть PointF переменную в вызов Draw. N>На Питоне примерно также, но можно cv::Point не писать, а отправить туда тупл. N>Разница колоссальная и по объёму кода и по идеологии. Не надо создавать точки, создавать окружности и у картинки вызывать метод Нарисовать Окружность. Подход будет: нарисовать Окружность с таким-то цетром и радиусом такого цвета. Как по мне, это логичнее.
Понятное дело, что слаботипизируемые языки тут выигрывают в плане скорости разработки. Для прототипирования и исследований оне хороши, а как в продакшн, так тот же С++ получше будет. А выбор компилируемых языков зависит от кроссплатформенности, библиотек и т.д.
Кстати, в плане скорости разработки есть ощущение, что matlab получше питона будет. Только он сильно платный. А так -- все изкаропки.
Здравствуйте, Sharov, Вы писали:
S>Может. Коллега в отделе математик, написал кучу кода (~20kloc) в процедурном стиле -- работа с матрицами и т.д. Все на C#, в процедурном стиле -- никаких наследований, паттернов и проч. я не видел в коде. S>При желании все возможно.
Это хорошо.
S>А сколько должно быть new? Можно создать статический конструктор и все сделать в цикле -- синтаксически будет один new. А вообще это дело исключительно привычки.
Ни одного не надо. Зачем это? Переходит чувак с Питона на C# и ему какие-то new надо писать, это не интуитивно. А что будет, если new пропустить? Случаем не ошибка в рантайме? Если так, то зачем такой язык вообще нужен? Это я с точки зрения питониста рассуждаю.
S>Ну тут явно вопросы к тем, кто портировал api. Оне совершенно разные. При желании код на шарпе тоже можно в три строчки написать -- заинлайнть PointF переменную в вызов Draw.
Да, но другого API нет, сделали таким, а в результате пользоваться неудобно. И эта претензия уже к языку: библиотека есть, вызовы есть, а пользоваться неудобно.
S>Понятное дело, что слаботипизируемые языки тут выигрывают в плане скорости разработки. Для прототипирования и исследований оне хороши, а как в продакшн, так тот же С++ получше будет. А выбор компилируемых языков зависит от кроссплатформенности, библиотек и т.д.
Вот, вот. На практике получается, что такой монстр как С++ получше будет. И это не только к OpenCV, но и к тому же Tensor Flow, например. А это одни из самых популярных библиотек на Гитхабе.
S>Кстати, в плане скорости разработки есть ощущение, что matlab получше питона будет. Только он сильно платный. А так -- все изкаропки.
Матлаб крут, но есть свои недостатки. И у него не всё из коробки: тулбоксы надо мало того, что докупать, так ещё и ставить их не сильно проще, чем сделать pip install. У R также просто устанавливаются дополнения.
Здравствуйте, Nuzhny, Вы писали:
N>Ни одного не надо. Зачем это? Переходит чувак с Питона на C# и ему какие-то new надо писать, это не интуитивно. А что будет, если new пропустить? Случаем не ошибка в рантайме? Если так, то зачем такой язык вообще нужен? Это я с точки зрения питониста рассуждаю.
Язык проектировался без оглядки на чуваков с питона, с оглядкой на яву. Чуваку такими вопросами задаваться, конечно, не стоит, но при первой же попытки запуска (и соотв. компиляции) он получить ответ на свой вопрос. В отличие от того же питона.
N>Да, но другого API нет, сделали таким, а в результате пользоваться неудобно. И эта претензия уже к языку: библиотека есть, вызовы есть, а пользоваться неудобно.
Субъективное суждение. Мне бы было удобно, при условии что интерфейс более-менее разумно составлялся и портировался.
N>Вот, вот. На практике получается, что такой монстр как С++ получше будет. И это не только к OpenCV, но и к тому же Tensor Flow, например. А это одни из самых популярных библиотек на Гитхабе.
Увы. Сами мс на шарп забили -- их DP библиотека (mnctk кажется) тоже на плюсах написана.
Здравствуйте, Nuzhny, Вы писали:
N>Прямо сейчас ему явно не хватает кроссплатформенности. Я его плохо знаю, но написание кода должно быть удобно для непрограммистов, математиков или статистиков. Такое возможно? При всей моей любви к С++ я точно знаю, что на нём неспециалист писать не сможет. Можно ли на C# писать в чисто процедурном стиле? Чтобы не думать о классах, их иерархии и архитектуре приложения? Это тоже не нужно.
То есть вопрос в том, может ли математик в своеобычном их математическом стиле насрать нечитаемым кодом.
Здравствуйте, alexsoff, Вы писали:
A>На c# за минуту пишется специализированный экстеншн (можно собрать свою библиотеку и переиспользовать в любом проекте) и код сокращается до A>
A> (trainSampleCount / 3).ForEach(i =>
A> {
A> img.DrawEx(trainData1, colors[0], i).
A> DrawEx(trainData1, colors[1], i).
A> DrawEx(trainData1, colors[2], i);
A> });
A>
О, красиво. Интересно, почему стандартные туториалы такие уродливые.
Здравствуйте, Слава, Вы писали:
С>То есть вопрос в том, может ли математик в своеобычном их математическом стиле насрать нечитаемым кодом. С>Да, может. Но так делать не надо.
Нет такого вопроса. Всё как раз наоборот: математические вещи надо писать математическим языком.
Здравствуйте, Nuzhny, Вы писали:
С>>То есть вопрос в том, может ли математик в своеобычном их математическом стиле насрать нечитаемым кодом. С>>Да, может. Но так делать не надо.
N>Нет такого вопроса. Всё как раз наоборот: математические вещи надо писать математическим языком.
Есть такой вопрос. Более того, когда программирование только начиналось — это уже было. Математики с их фортраном, который невозможно поддерживать и понять самому, если кода не видел месяц. Потом люди писать научились.
А сейчас видимо пришла новая волна людей, неспособных излагать свои мысли понятно для окружающих.
Здравствуйте, wamaco, Вы писали:
N>>Нет такого вопроса. Всё как раз наоборот: математические вещи надо писать математическим языком. W>Ок, а Паскаль для каких нужд по Вашему?
В мою юность для обучения школьников. Давай уже весь список известных языков выкладывай, что по одному спрашивать.
Здравствуйте, Слава, Вы писали:
С>Есть такой вопрос. Более того, когда программирование только начиналось — это уже было. Математики с их фортраном, который невозможно поддерживать и понять самому, если кода не видел месяц. Потом люди писать научились.
Главное, чтобы работало. Мы — программисты это всё в человеческом виде в продакшен запилим. Ддля этого и работаемм.
С>А сейчас видимо пришла новая волна людей, неспособных излагать свои мысли понятно для окружающих.
A>На c# за минуту пишется специализированный экстеншн (можно собрать свою библиотеку и переиспользовать в любом проекте) и код сокращается до A>
cut
A>
A> (trainSampleCount / 3).ForEach(i =>
A> {
A> img.DrawEx(trainData1, colors[0], i).
A> DrawEx(trainData1, colors[1], i).
A> DrawEx(trainData1, colors[2], i);
A> });
A>
Только вот у того, кто будет читать этот код, возникнет много вопросов. Что такое DrawEx? Зачем DrawEx принимает параметр i? Что должно содержаться в trainData1 (какой размерности массив/какой порядок следования координат)? Круг какого радиуса нарисует DrawEx? Что будет, если i выйдет за границы размера trainData1 (exception или ничего)?
С другой стороны на Python весь код будет выглядеть примерно так без никаких экстеншенов вообще и ответы на все вопросы выше ясны сразу же:
for trainData, color in zip([trainData1, trainData2, trainData3], colors[:3]):
for x, y in trainData[:trainSampleCount // 3]:
cv2.circle(img, (x, y), 2, color)
Здравствуйте, De-Bill, Вы писали:
M>>>То есть проблемы C# он не скриптовый и под него все плохо с библиотеками M>>можно расшифровать это?
DB>C# из-за статической типизации, тяжеловесности конструкций и т.д. не подходит для "интерактивной разработки"/REPL (типа как jupyter notebook для Python), а без этого работать с данными и их анализировать очень неудобно. DB>С библиотеками для data science у него не то чтобы всё плохо. Их просто практически нет.
я не совсем знаком с интерактивной разработкой в Питоне, но в последних версиях VS появилась C# interactive где можно писать на лету любой код вроде