Взаимодействие скриптов Python и C ++ - PullRequest
1 голос
/ 28 января 2011

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

Объяснение проблемы:

Что делают сценарии: Программа на C ++ (не сделанная мной, и я не очень хорошо программирую на c ++): берет массив из 7 чисел и возвращает одно простое число. Скрипт Python (мой, и я могу немного программировать на Python): генерирует эти 7 числовых массивов, передает их в программу c ++, ждет ответа и добавляет его в список. Затем он создает следующий массив.

Теоретически это работает. Однако, как и сейчас, он открывает и закрывает программу на С ++ для каждого вызова. Для одного массива это не проблема, но я пытаюсь увеличить до 25К массивов, а в будущем до 6+ миллионов массивов. Очевидно, что тогда уже невозможно каждый раз открывать / закрывать его, тем более что программе c ++ для начала необходимо загрузить VCD-файл объемом 130 МБ.

Два варианта, которые я подумал о себе, заключались в том, чтобы сначала сгенерировать все массивы на python, затем передать их в программу c ++ и затем проанализировать все результаты. Однако я не знаю, как это сделать с массивами 6M. Однако не важно, что результаты, которые я получаю, находятся в том же порядке, что и массивы, в которые я добавляю данные.

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

(Примечание: я не могу программировать ни на чем другом, кроме python, и хочу сделать этот проект на python. Программу на c ++ нельзя перевести на python по соображениям скорости.)

Заранее спасибо, Макс.

Ответы [ 5 ]

1 голос
/ 28 января 2011

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

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

Обратите внимание, что простое наматывание цикла вокруг функции main() программы на C ++ не очень поможет, потому что, очевидно, главная проблема - это время, необходимое программе для чтения своих данных (VCD, который вы упомянули).

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

1 голос
/ 28 января 2011

Хорошо, ваш лучший способ действий - это, вероятно, написать расширение C / C ++ для Python, способное вызывать код C ++, который выполняет необходимые вычисления. Это не очень сложно, для его работы потребуется лишь минимальное количество кода на C / C ++. Хорошее объяснение расширения Python можно найти на странице Python по адресу http://docs.python.org/extending/extending.html

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

Если вам нужна помощь, чтобы заставить его работать, я уверен, что мы можем вам помочь.

1 голос
/ 28 января 2011

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

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

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

0 голосов
/ 28 января 2011

Я думаю, вы делаете это неправильно

Что делают сценарии: программа на C ++ (не сделанная мной, и я не очень хорошо программирую на c ++): берет массив из 7 чисел и возвращает одно простое число. Скрипт Python (мой, и я могу немного программировать на Python): генерирует эти 7 числовых массивов, передает их в программу c ++, ждет ответа и добавляет его в список. Затем он создает следующий массив.

У вас есть это?

python generate_arrays.py | someC++app | python gather_array.py

Это позволяет вам запускать три части параллельно, используя каждое ядро ​​каждого процессора на коробке. ОС гарантирует, что все три запускаются одновременно.

Если вы все еще не получаете 100% загрузку процессора, вам придется сделать что-то вроде этого.

( python generate_arrays.py --even | someC++app >oneFile ) & ( python generate_arrays.py --odd | someC++app > anotherFile )
python gather_array.py oneFile anotherFile

Это позволит запустить две копии python generate_arrays.py и две копии вашей магической программы на C ++.

Вам придется переписать вашу программу generate_arrays.py, чтобы она принимала параметр командной строки. Когда опция --even, вы генерируете 3 миллиона массивов. Если указан параметр --odd, вы генерируете 3 миллиона других массивов.

Этот (python | c ++) & (python | c ++) должен использовать процессор на 100%.

0 голосов
/ 28 января 2011

Я думаю, что лучший способ - создать модуль расширения C ++ для python.Есть много способов сделать это.Если у вас есть исходники c ++, вы можете попробовать SWIG . После этого вы можете использовать функции / объекты c ++ непосредственно внутри python - и управлять ими с помощью модулей python (здесь обработка).Это действительно просто.

...