Подтвердить что ты не робот

Производительность Python - вам когда-нибудь приходилось переписывать что-то еще?

Кто-нибудь когда-либо имел код на Python, который оказался недостаточно быстрым?

Я имею в виду, из-за этого вы были вынуждены выбрать другой язык?

Мы изучаем использование Python для нескольких более крупных проектов, и я чувствую, что в большинстве случаев Python достаточно быстр для большинства сценариев (по сравнению, например, Java), потому что он опирается на оптимизированные подпрограммы C.

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

Спасибо.

4b9b3361

Ответ 1

Да, у меня есть. Я написал программу подсчета строк для двоичного файла (длина-префикс, а не разграниченного) выходного файла bcp один раз, и ему пришлось переделать его на C, потому что python был слишком медленным. Эта программа была довольно маленькой (потребовалось всего пару дней, чтобы переписать ее на C), поэтому я не стал пытаться создать гибридное приложение (питон python с центральными подпрограммами, написанный на C), но это также имело бы был жизнеспособным маршрутом.

Более крупное приложение с критическими критическими характеристиками может быть записано в комбинации C и языка более высокого уровня. Вы можете написать критически важные компоненты в C с интерфейсом к Python для остальной части системы. SWIG, Pyrex или Boost.Python (если вы используете С++), все они обеспечивают хорошие механизмы для сантехники для вашего интерфейса Python. C API для python более сложный, чем для Tcl или Lua, но невозможно построить вручную. Для примера ручного API Python/C проверьте cx_Oracle.

Этот подход был использован в довольно многих успешных приложениях, которые вернулись к 1970-м годам (что я знаю). Mozilla был существенно написан в Javascript вокруг ядра, написанного на C. Несколько CAD-пакеты, Interleaf (технический система публикации документов), и, конечно, EMACS в основном написаны в LISP с центральным языком C, ассемблером или другим ядром. Довольно много коммерческих приложений с открытым исходным кодом (например, Chandler или Sungard Front Arena) используют встроенные интерпретаторы Python и реализуют существенные части приложения на Python.

РЕДАКТИРОВАТЬ: В ответ на комментарий голландских мастеров, удерживая кого-то с навыками программирования на C или С++ в команде для проекта Python, вы можете написать часть приложения для скорости. Области, где вы можете ожидать значительного прироста производительности, - это то, где приложение делает что-то очень итеративное по большой структуре данных или большому объему данных. В случае счетчика строк выше он должен был вдыхать ряд файлов на общую сумму в несколько гигабайт и проходить процесс, где он читал префикс переменной длины и использовал его для определения длины поля данных. Большинство полей были короткими (всего несколько байтов). Это было несколько немного круто и очень низко и итеративно, что сделало его естественным подспорьем для C.

Многие библиотеки python, такие как numpy, cElementTree или cStringIO используют оптимизированное ядро ​​C с API-интерфейсом python, что облегчает работу с данными в совокупности. Например, numpy имеет структуры матричных данных и операции, написанные на C, которые выполняют всю сложную работу и API Python, предоставляющий услуги на уровне совокупности.

Ответ 2

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

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

На самом деле никто не может действительно ответить на ваш вопрос, если они не уверены, что могут создать оптимальное решение на обоих языках, что маловероятно. Другими словами, "Мое решение C было быстрее, чем мое решение на Python", это не то же самое, что "C быстрее, чем Python"

Я готов поспорить, что Guido Van Rossum мог написать Python решения для задач adam и Dustin, которые выполнялись достаточно хорошо.

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

Ответ 3

Добавление моих $0,02 для записи.

Моя работа связана с разработкой числовых моделей, которые содержат более 100 гигабайт данных. Тяжелые проблемы - это быстро принести доходное решение (т.е. Время выхода на рынок). Чтобы быть коммерчески успешным, решение также должно выполняться быстро (вычислить решение в минимальное время).

Для нас Python оказался отличным выбором для разработки решений по общепринятым причинам: быстрое время разработки, выразительность языка, богатые библиотеки и т.д. Но для удовлетворения потребностей в скорости выполнения мы приняли подход "гибрид" что уже упоминалось несколько ответов.

  • Использование numpy для вычислительно интенсивных частей. Мы получаем от 1.1x до 2.5x скорость "родного" С++-решения с numpy с меньшим количеством кода, меньшим количеством ошибок и коротким временем разработки.
  • Травление (сериализация объектов Python) промежуточных результатов для минимизации повторных вычислений. Характер нашей системы требует нескольких шагов по тем же данным, поэтому мы "запоминаем" результаты и повторно используем их там, где это возможно.
  • Профилирование и выбор лучших алгоритмов. Это было сказано в других ответах, но я повторю: мы вытаскиваем cProfile и пытаемся заменить горячие точки лучшим алгоритмом. Не применимо во всех случаях.
  • Переход на С++. Если выше это не удается, мы называем библиотеку С++. Мы используем PyBindGen для написания наших обложек Python/С++. Мы обнаружили, что он намного превосходит SWIG, SIP и Boost.Python, поскольку он создает прямой код API Python C без промежуточного уровня.

Считывая этот список, вы можете подумать: "Какая большая работа! Я просто сделаю это в [C/С++/Java/ассемблере] в первый раз и сделаю с ним".

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

Ответ 4

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

Для 90% того, что мы хотели, было прекрасно, и поскольку изображения были достаточно низким, скорость была неплохой. Тем не менее, некоторые из процессов потребовали некоторых сложных пиксельно-пиксельных вычислений, а также сверток, которые, как известно, медленны. Для этих конкретных областей мы повторно написали самые внутренние части циклов в C и только обновили старые функции Python для вызова функций C.

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

Ответ 5

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

Если что-то не достаточно быстро, мы просматриваем его с помощью cProfile и находим узкие места. Обычно есть одна или две функции, которые занимают 80 или 90% времени выполнения. Затем мы берем эти функции и переписываем их на C, то, что Python упрощает с помощью C API. Во многих случаях это приводит к порядку или более ускорению. Проблема исчезла. Затем мы продолжаем наш веселый путь, продолжая писать все остальное в Python. Промыть и повторить...

Для целых модулей или классов мы склонны использовать Boost.python, это может быть немного медведя, но в конечном итоге хорошо работает. Если это просто функция или две, мы иногда включаем ее с scipy.weave, если проект уже использует scipy.

Ответ 6

Всякий раз, когда я нахожу узкое место на Python, я переписываю этот код в C как модуль Python.

Например, у меня есть аппаратное обеспечение, которое отправляет пиксели изображения как 4-байтовые 0RGB. Преобразование 8M из 0RGB в RGB в Python занимает слишком много времени, поэтому я переписал его как модуль Python.

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

Ответ 7

Этот вопрос, вероятно, начнет религиозную войну среди языковых людей, поэтому позвольте мне ответить на это немного по-другому.

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

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

Это длинный ответ, чтобы ответить на ваш вопрос напрямую; нет, python (иногда с расширениями C) был достаточно быстрым для всего, что мне нужно для этого. Единственный раз, когда я действительно погружаюсь в C, вы получаете доступ к материалам, которые не имеют привязок к python.

Изменить: мой фон - программист на языке python на большом .com, где мы используем python для всего, начиная с front-end наших веб-сайтов, вплоть до всех бэк-офисных систем. Python - это язык корпоративного уровня.

Ответ 8

При внедрении специализированного сервера memcache для определенного типа данных бэкэнд для хранилища будет более эффективным с точки зрения памяти, а время поиска может быть уменьшено с помощью бит-мутных операций поиска (то есть: O (1) поиск).

В течение 2 дней я написал всю часть процесса и часть процесса, управляемую событиями, с Python, дав нам достаточно времени, чтобы проверить функциональность и сосредоточиться на производительности, в то время как команда проверяла соответствие протокола и другие биты.

Учитывая такие инструменты, как Pyrex, реализация C-расширений для Python приближается к тривиальным для любого разработчика, немного знакомого с C. Я переписал Radix Tree на базе хранилища на C и сделал его модулем Python с Pyrex в течение дня. Использование памяти для префиксов 475K уменьшилось с 90 МБ до 8 МБ. Мы получили скачок производительности на 1200%.

Сегодня это приложение работает с pyevent (интерфейс Python для libevent), а новый сервер хранения обрабатывает 8000 запросов в секунду скромный одноядерный сервер, работающий как демон одиночного процесса (благодаря libevent), потребляющий менее 40 МБ памяти (включая интерпретатор Python) при одновременном подключении 300+ одновременных подключений.

Это проект, разработанный и реализованный для обеспечения качества продукции менее чем за 5 дней. Без Python и Pyrex это займет больше времени.

Мы могли бы устранить проблему с производительностью, просто используя более мощные серверы и переключившись на мультипроцессорную/многоэкземплярную модель, одновременно усложняя задачи с кодом и администрированием, а также значительно больший объем памяти.

Я думаю, что вы на правильном пути, чтобы пойти с Python.

Ответ 9

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

Во многих случаях питон был прекрасен, и я был доволен этим. В некоторых случаях, когда он начал приближаться к 23 часам, чтобы делать журналы дней, я бы переписал.:)

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

Ответ 10

Вы всегда можете написать части своего приложения в Python. Не каждый компонент одинаково важен для производительности. Python легко интегрируется с С++ изначально или с Java через Jython или с .NET через IronPython.

Кстати, IronPython более эффективен, чем реализация C на Python в некоторых тестах.

Ответ 11

Я работаю некоторое время, разрабатывая приложение, которое работает с большими структурированными данными, хранящимися в базе данных размером в несколько гигабайт и хорошо, Python для этого достаточно хорош. Приложение имеет клиент GUI с множеством элементов управления (списки, деревья, ноутбуки, виртуальные списки и т.д.) И консольный сервер.

У нас были некоторые проблемы с производительностью, но в основном они были связаны скорее с плохим дизайном алгоритмов или ограничениями в работе с базами данных (мы используем Oracle, MS-SQL, MySQL и имели короткий роман с BerkeleyDB, используемый для оптимизации скорости), чем сам Python. Как только вы знаете, как правильно использовать стандартные библиотеки (написанные на C), вы можете сделать код очень быстрым.

Как утверждают другие, любой алгоритм с интенсивным вычислением, который зависит от битового наполнения, некоторые вычисления с ограничением памяти - может выполняться в сыром C/С++ для сохранения CPU/памяти (или любых других трюков), но все взаимодействие с пользователем, протоколирование, обработка базы данных, обработка ошибок - все, что заставляет приложение запускаться, может быть написано на Python, и оно будет поддерживать отзывчивость и достойную общую производительность.

Ответ 12

Я развиваюсь в python уже несколько лет. Недавно мне пришлось перечислить все файлы в каталоге и построить структуру с именем, размером, атрибутами и датой изменения. Я сделал это с помощью os.listdir и os.stat. Код был довольно быстрым, но чем больше записей в каталогах, тем медленнее мой код превратился в других файловых менеджеров с одним и тем же каталогом, поэтому я переписал код с помощью SWIG/С++ и был действительно удивлен, насколько быстрее был код.

Ответ 13

Да, дважды:

  • Приложение для аудио DSP я полностью переписал на С++, потому что я не мог получить соответствующую производительность в Python; Я не рассматриваю реализацию Python впустую, потому что это позволило мне прототипировать концепцию очень легко, а порт С++ прошел гладко, потому что у меня была рабочая эталонная реализация.

  • Проект процедурного графического рендеринга, где создание больших 2D текстурных карт в Python длилось долго; Я написал С++ DLL и использовал ctypes/windll, чтобы использовать его с Python.

Ответ 14

Нет, мне никогда не приходилось переписывать. Фактически, я начал использовать Python в Maya 8.5. До Maya 8 единственным доступным языком скриптов был встроенный MEL (язык выражений Maya). Python на самом деле быстрее, чем встроенный язык, который он обертывает.

Возможность работы Python со сложными типами данных также ускорялась, поскольку MEL может хранить только одномерные массивы (и без указателей). Это потребует, чтобы многомерные массивы были подделаны либо с использованием нескольких параллельных массивов, либо с помощью медленной конкатенации строк.

Ответ 15

Месяц назад у меня была небольшая программа, написанная на Python (для работы), которая анализирует журналы. Когда число файлов журналов выросло, программа начала очень медленно, и я подумал, что могу переписать ее на Java.

Мне было очень интересно. Для переноса одного и того же алгоритма с Python на Java потребовался целый день. В конце концов, в нескольких тестовых тестах я убедительно показал, что Java-программа была на 20%/25% медленнее, чем ее аналоги Python. Это было для меня неожиданностью.

Запись во второй раз алгоритм также показал мне, что возможна некоторая оптимизация. Таким образом, через два часа я полностью переписал все это на Python, и это было на 40% быстрее, чем исходная реализация Python (следовательно, порядок времени был быстрее, чем у версии Java, которую я имел).

Итак:

  • Python - медленный язык, но для определенных задач может быть быстрее, чем другие, предположительно, более быстрые языки

  • Если вам нужно тратить время на то, чтобы написать что-то на языке, исполнение которого выполняется быстрее, но время разработки которого медленнее (большинство языков), подумайте о том же времени, чтобы проанализировать проблему, найти библиотеки, профиль и затем написать лучший код Python.

Ответ 16

Мне приходилось писать генератор псевдослучайных чисел для симулятора. Сначала я написал его на Python, но Python оказался слишком медленным; Я закончил переписывать его на C, и даже это было медленно, но не так медленно, как Python.

К счастью, довольно легко скрыть Python и C, поэтому я смог написать PRNG как модуль C и все еще написать остальную часть симулятора в Python.

Ответ 17

Следующая ссылка обеспечивает сопоставление между несколькими языками компьютера. Это должно дать вам представление о сильных и слабых сторонах Python в разных проблемных областях.

Компьютерная игра Benchmarks Game

Ответ 18

Я сейчас переписываю программу Perl OpenKore в Python под именем Erok (обратная сторона оригинала Kore). До сих пор Python оказался лучшим языком, особенно из-за его мощных функций синтаксического разбора строк, которые не требуют использования регулярных выражений, что действительно ускоряет большую часть анализа файла.

Ответ 19

Обычно я не переписываю C до I:

  • Профиль
  • переписать с помощью алгоритмов bette (обычно этого достаточно)
  • переписать код python с низким уровнем производительности в уме (но не до такой степени, что у него нет pythonic/non readable code)
  • потратить некоторое время на повторную проверку библиотеки не может этого сделать (сначала в stdlib или внешней lib)
  • попробовал psyco/другие реализации (редко добивается повышения скорости REAL в моем случае)

Затем иногда я создавал общую библиотеку для выполнения кода вычисления тяжелых матриц (что не могло быть сделано с numarray) и вызывало его с помощью ctypes:

  • просто написать/построить/протестировать .so/dll в чистом C,
  • просто инкапсулировать функцию C в python (т.е. вы не используете, если используете базовые типы данных, поскольку ctypes выполняет всю работу по вызову правильных аргументов для вас) и, конечно, достаточно быстро.