Python с Numpy / Scipy против Pure C ++ для анализа больших данных

Работа с Python в относительно небольших проектах заставляет меня ценить динамически типизированную природу этого языка (нет необходимости в коде объявления для отслеживания типов), что часто делает процесс разработки более быстрым и менее болезненным. Однако я чувствую, что в гораздо более крупных проектах это может быть помехой, поскольку код будет работать медленнее, чем, скажем, его эквивалент в C ++. Но с другой стороны, использование Numpy и / или Scipy с Python может заставить ваш код работать так же быстро, как и нативная программа C ++ (где для разработки кода на C ++ иногда требуется больше времени).

Я отправляю этот вопрос после прочтения комментария Джастина Пила в теме «Является ли Python быстрее и легче, чем C ++?«где он утверждает:
«Кроме того, люди, которые говорят о том, что Python медлителен для серьезного перебора чисел, не использовали модули Numpy и Scipy. В наши дни Python действительно развивается в научных вычислениях. Конечно, скорость достигается за счет использования модулей, написанных на C, или написанных библиотек. в Фортране, но, на мой взгляд, в этом прелесть скриптового языка. » Или, как пишет С. Лотт в том же потоке о Python: «… так как он управляет памятью, мне не нужно ничего делать с памятью, чтобы сэкономить часы на устранение утечек ядра». Я также проверил Python / Numpy / C ++ связанный с вопросом производительности на «Бенчмаркинг (Python против C ++ с использованием BLAS) и (Numpy)«где пишет Дж.Ф. Себастьян:« Нет никакой разницы между C ++ и numpy на моей машине ».

Оба этих потока заставили меня задуматься о том, есть ли какое-либо реальное преимущество, связанное с знанием C ++ для программиста на Python, который использует Numpy / Scipy для создания программного обеспечения для анализа «больших данных», где производительность, очевидно, имеет большое значение (но также читаемость кода и разработка скорость просто необходима?

Примечание: мне особенно интересно работать с огромными текстовыми файлами. Текстовые файлы порядка 100K-800K строк с несколькими столбцами, где Python может анализировать файл длиной всего 200K строк в течение пяти минут.

12

Решение

Во-первых, если основная часть вашей «работы» связана с обработкой огромных текстовых файлов, это часто означает, что единственным значимым узким местом вашей скорости является скорость дискового ввода-вывода независимо от языка программирования.


Что касается основного вопроса, он, вероятно, слишком богат мнением, чтобы «ответить», но я могу, по крайней мере, поделиться своим собственным опытом. Я писал Python для обработки больших данных (погодных и экологических данных) в течение многих лет. Я никогда не сталкивался с серьезными проблемами с производительностью из-за языка.

То, что разработчики (включая меня) имеют тенденцию забывать, — то, что как только процесс запускается достаточно быстро, тратить время на то, чтобы заставить его работать быстрее, — пустая трата ресурсов компании. Python (используя зрелые инструменты, такие как pandas/scipy) работает достаточно быстро, чтобы соответствовать требованиям, и быстро развивается, поэтому за мои деньги это вполне приемлемый язык для обработки «больших данных».

11

Другие решения

Короткий ответ: для простых задач не должно быть большой разницы. Если вы хотите сделать что-то сложное, то вы быстро столкнетесь с резкими различиями в производительности.

В качестве простого примера попробуйте добавить три вектора вместе

a = b + c + d

В питоне, насколько я понимаю, это вообще добавляет b в c, добавляет результат к dи затем укажите на этот конечный результат. Каждая из этих операций может быть быстрой, поскольку они просто передаются в библиотеку BLAS. Однако, если векторы велики, то промежуточный результат не может быть сохранен в кеше. Перемещение этого промежуточного результата в основную память происходит медленно.

Вы можете сделать то же самое в C ++, используя valarray, и это будет эквивалентно медленно. Тем не менее, вы также можете сделать что-то еще

for(int i=0; i<N; ++i)
a[i] = b[i] + c[i] + d[i]

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

Выполнение эквивалентных действий в python возможно, но циклические конструкции python не так эффективны. Они делают приятные вещи, такие как проверки границ, но иногда быстрее работать с отключенными средствами защиты. Java, например, проделывает большую работу по удалению проверок границ. Так что, если у вас достаточно умный компилятор / JIT, циклы python могут быть быстрыми. На практике это не сработало.

5

питон определенно сэкономит ваше время на разработку, он также обеспечит вам гибкость, если вы просто сравниваете здесь два языка, хотя он все еще не может сравниться с мощностью и производительностью C / C ++ но кого это волнует в этот век высокой памяти, кластеров, кэширования и методов параллельной обработки? Другим недостатком C ++ могут быть возможные сбои, а затем отладка и исправление больших данных может стать кошмаром.

Но, сказав, что я не видел места, где есть один размер, подходящий для всех доступных решений, ни один язык программирования не содержит решений для каждой проблемы (если только вы не являетесь старым разработчиком на C, который также любит создавать базу данных на C: ) сначала нужно определить все проблемы, требования, тип данных, структурированные или неструктурированные, с какими текстовыми файлами вам нужно манипулировать, каким образом и в каком порядке, планировать проблему и т. д. Затем вам нужно создать полный набор приложений с некоторыми наборами инструментов и языками сценариев. Как вы всегда можете положить больше денег на оборудование или даже купить какой-нибудь дорогой инструмент, как Ab Initio которые дают вам возможность загружать и анализировать эти большие текстовые файлы и манипулировать данными, если вам не нужны действительно мощные возможности сопоставления с шаблоном для действительно больших файлов данных, python прекрасно подойдет для работы с другими инструментами. Но я не вижу ни одного ответа да / нет, в некоторых ситуациях Python может быть не лучшим решением.

1
По вопросам рекламы [email protected]