Скорость - встраивание Python в C ++ или расширение Python с C ++ - PullRequest
0 голосов
/ 17 марта 2012

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

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

Теперь я думаю о смешивании Python с C ++ с использованием Boost :: Python и Python C. API.

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

Я обязательно получу некоторое увеличение скорости, используя код на C ++ для вычисляемых частей, и я думаю, что вызов интерпретатора Python внутриC-приложение не будет лучше, потому что интерпретатор Python будет работать все время.И я должен обернуть вещи в python-библиотеки, такие как mysqldb или urllib3, чтобы иметь хороший способ работы внутри c ++.

Итак, что бы вы предложили, лучший путь: расширение или встраивание?(Мне нравится язык python, но я также знаком с c ++ и уважаю его за скорость)

Обновление: поэтому я переключил некоторые части с python на c ++ и использовал многопоточность (настоящую) в моих модулях cа моей программе сейчас нужно вместо 7 часов 30 минут :))))

Ответы [ 2 ]

4 голосов
/ 17 марта 2012

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

Все исследования последних 50 лет показывают, что люди часто имеют неточную интуицию в отношении проблем с производительностью системы.ИМХО, вам действительно нужно собрать некоторые доказательства, измерить то, что на самом деле происходит, а затем выбрать решение, основанное на этих доказательствах.

Чтобы попытаться подтвердить, что является причиной низкой производительности, измерьте систему и время пользователя вашего приложения (например, time python prog.py) и измерьте нагрузку на машину.

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

Но если процессор не загружен, или приложение проводит большую часть своего времени в системе (системное время), а не в приложении (пользовательское время), маловероятно, что изменение технологии прикладного программированияпоможет значительно.(Это пример закона Амдала http://en.wikipedia.org/wiki/Amdahl%27s_law)

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

2 голосов
/ 17 марта 2012

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

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

Это дает вам лучшее из обоих: скорость C ++, где вам это нужно, простота использования и гибкость Pythonгде-либо еще.Также замечательно то, что вы можете выполнять этот процесс шаг за шагом, заменяя медленные пути кода на by, оставляя вас всегда со всем приложением в работоспособном (и тестируемом!) Состоянии.

Обратноене имеет смысла: вам придется переписать почти весь код, жертвуя гибкостью структуры Python.

Тем не менее, как всегда, когда речь идет о производительности, прежде чем действовать measure : ifВаше узкое место не связано с процессором / памятью, переключение на C ++ вряд ли даст много преимуществ.

...