![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
turist |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 13.8.2007 Где: Киев Репутация: нет Всего: нет |
Появилась задачка переделывать большие куски python-кода на C++. Некоторые функции "украшены" yield-ами и являются к тому же рекурсивными, вызывая самих себя в циклах типа "for i in this_func()...". Есть ли у кого-нить выработанные паттерны разворачивания таких функций в более C++-ный вид? Уж больно страшным и монтрообразным это пока что представляется. Может, boost какой-нибудь или другая "silver-bullet"?
Вобщем, товарищи программисты, помогите кто чем сможет. Это сообщение отредактировал(а) turist - 6.7.2008, 12:31 |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 2 Всего: 154 |
Я думаю все не надо переписывать, а только то, что является узким местом... байндинг для С++ кода можно сделать к примеру с помощью boost::python, ну и рекурсия для С++ не является чем-то диким
![]() Хотя более естественным для С++ было-бы использование цикла, вместо рекурсии... |
|||
|
||||
albertn |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
yield-ы в принципе можно перевести различными способами:
1. сделать чтобы функция возвращала не итератор а массив целиком 2. сделать какую-либо внешнюю переменную, в которой бы хранилась информация с какого места нужно продолжать и то делать 3. разобраться в логике и написать полностью самому. Я бы сказал, что рекурсия для питона является чем-то диким, т.к. вызов функций в питоне происходит очень медленно, и следовательно скорость выполнения программы на питоне с рекурсией значительно ниже по сравнению программы на питоне с циклом (и стеком) и без рекурсии. Честно говоря мне непонятно зачем нужно переводить программу из Питона в Си. Не проще ли вызывать питоновские фрагменты из Си? |
|||
|
||||
Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 10 Всего: 173 |
Не понимаю, какая может быть связь между рекурсией и языком программирования.
Давайте отделим мух от котлет, а именно хвостовую рекурсию как альтернативу циклу и алгоритмы, рекурсивные по своей природе. Первым вариантом пользуются только в чисто функциональных языках, и ни в Питоне, ни в Си++ никто в здравом смысле применять эту технику не будет. Во втором случае альтернатива рекурсии — ручное управление стеком. (Берём алгоритмы, для которых рекурсия или итерация — это вопрос константы, не влияющей на O большое. Т.е. не рассматриваем случаи вроде наивного рекурсивного вычисления последовательности Фибоначчи.) Для современных компиляторов это крайне редко даёт ощутимый выигрыш. Для интерпретаторов также имеем сомнительный размен рекурсивного вызова на вызов методов структуры данных (списка, к примеру). И всё это ценой потери читаемости алгоритма: premature optimization и далее по тексту. Ближе к делу. Лучше всего, конечно, вникнуть в логику и не пытаться скопировать максимально близко к тексту. Генераторы эти, по сути, что делают? Обходят некоторую структуру данных, или может подгружают данные извне, или генерируют некоторую последовательность... Думается, общего метода для переноса генераторов в Си++ нет, точнее, он будет излишне сложным. Например, можно заменить yield на вызов callback-функции.
vs (очень условный код)
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
megaflop |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 5.5.2005 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
PyPy
The PyPy project aims at producing a flexible and fast Python implementation. The guiding idea is to translate a Python-level description of the Python language itself to lower level languages. Rumors have it that the secret goal is being faster-than-C which is nonsense, isn't it? |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Python: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |