Заставить модули запускаться в PyPy из скрипта CPython (запускать PyPy в части кода)?

Есть ли способ импортировать модули из скрипта CPython, но запускать их в PyPy?

Проблема в том, что у меня есть код, который использует много SciPy (и NumPy), но есть части кода, которые можно оптимизировать с помощью PyPy.

Вот случайный пример того, что я хотел бы сделать:

Модуль sub_run_in_pypy.py:

#assuming this can be optimized with PyPy
def function_a(foo):
    return foo**2

модуль main_run_in_cpython.py:

import scipy.stats as stats

#assuming this exists:
import import_function_for_pypy
pypy_imported_function = import_function_for_pypy(module_name=sub_run_in_pypy, function_name=function_a)

x = stats.t.rvs(5, loc=0, scale=1, size=1)

print pypy_imported_function(x)

Если этого нет, то почему?

Правка: Как предположил Бакуриу, я предположил, что потенциально это может быть что-то, что выполняется в отдельном процессе. Не приведет ли это к слишком большим накладным расходам?


person TimY    schedule 08.04.2013    source источник
comment
Я не понимаю. Вы хотите запустить какой-то код как CPython и какой-то код как PyPy? Затем вы должны использовать два разных процесса, один с PyPy и один с CPython, но это добавит много накладных расходов для связи между процессами.   -  person Bakuriu    schedule 08.04.2013
comment
Да, это то, что я предлагал - действительно ли накладные расходы так сильно снижают производительность? (извините, что было непонятно)   -  person TimY    schedule 08.04.2013
comment
Это зависит. Многопроцессорность позволяет вам добавить некоторые параллельные вычисления, которые могут увеличить скорость вычислений на многоядерных машинах, но вы должны быть осторожны, чтобы избежать большого количества небольших взаимодействий между процессами. Избегайте отправки небольших информационных пакетов, старайтесь как можно чаще использовать пакетные сообщения. Мы не можем ничего сказать больше без конкретного кода. Вам, вероятно, следует попробовать profile (по крайней мере, с некоторым примером кода).   -  person Bakuriu    schedule 08.04.2013
comment
Я понимаю. Итак, вы предполагаете, что это не является общепринятой практикой из-за того, что эффективность зависит от кода. К сожалению, я не могу опубликовать код, так как он слишком длинный и сложный, но спасибо за предложение. Я посмотрю, что я могу сделать.   -  person TimY    schedule 08.04.2013
comment
Как правило, вы должны учитывать, что каждое взаимодействие между процессами примерно в 1000 или более раз медленнее, чем обычные операции. В зависимости от задачи может быть или не быть возможным разбавить эти тяжелые операции среди других, чтобы получить ускорение. Другие задачи по своей сути являются последовательными, и, несмотря ни на что, вы не получите большого ускорения с распараллеливанием. Итак, да, это сильно зависит от вашей проблемы. Есть несколько обычных способов сделать это, например. каналов, RPC, сигналов или сокетов, поэтому вам следует взглянуть на стандартную библиотеку< /а>.   -  person Bakuriu    schedule 08.04.2013


Ответы (1)


Поскольку я наткнулся на этот вопрос задолго до другой темы, обратный механизм кратко описан здесь (Могу ли я встроить CPython внутрь PyPy?).

Основная идея состоит в том, чтобы запустить интерпретатор PyPy вместе с интерпретатором CPython (или наоборот) и соединить их посредством межпроцессного взаимодействия. Хотя у вас может возникнуть соблазн сделать это через каналы или сокеты, настоятельно рекомендуется использовать библиотеку более высокого уровня, такую ​​как execnet (на самом деле это используется для этой цели).

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

person MisterMiyagi    schedule 18.09.2015