переписать код с python на c
Конвертировать программу Python в код C / C++? [закрытый]
Мне нужно реализовать пару алгоритмов, и я не уверен, что разрыв в производительности достаточно велик, чтобы оправдать всю боль, которую я прошел бы, делая это на C/C++ (что я не очень хорошо). Я подумал о том, чтобы написать один простой алгоритм и сравнить его с таким преобразованным решением. Если только это значительно быстрее, чем версия Python, то у меня не будет другого выбора, кроме как делать это на C/C++.
8 ответов
да. Посмотреть на Cython. Он делает именно это: преобразует Python в C для ускорения.
Если вариант C требует x часов меньше, то я бы инвестировал это время в то, чтобы алгоритмы работали дольше / снова
«инвестировать» здесь не то слово.
создайте рабочую реализацию в Python. Вы закончите это задолго до того, как закончите версию C.
измерьте производительность с помощью профилировщика Python. Исправьте любые проблемы, которые вы найдете. Изменение структур данных и алгоритмов по мере необходимости это правильно. Вы закончите это задолго до того, как закончите первую версию в C.
если он все еще слишком медленный, вручную переведите хорошо спроектированный и тщательно построенный Python в C.
из-за того, как работает ретроспектива, выполнение второй версии из существующего Python (с существующими модульными тестами и с существующими данными профилирования) все равно будет быстрее, чем попытка сделать код C с нуля.
Томпсон для создателей телескопа
Быстрее сделать четырехдюймовое зеркало, а затем шестидюймовое зеркало, чем сделать шестидюймовое зеркало.
Билл McKeenan
Wang Institute
Пролить Кожи является»(ограниченным) компилятором Python-to-C++».
только что наткнулся этой новый инструмент в hacker news.
цитата высокая производительность Python от Михи Горелицк и Ян Ozsvald:
Pythran-это компилятор Python-to-C++ для подмножества Python, который включает частичное numpy поддержка. Он действует немного как Numba и Cython-вы аннотируете аргументы функции, а затем она берет на себя с дальнейшим типом аннотации и специализацией кода. Это занимает преимущество возможностей векторизации и OpenMP-based возможности распараллеливания. Он работает только с Python 2.7.
одна очень интересная особенность Pythran заключается в том, что он попытается автоматическое определение возможностей распараллеливания (например, если вы с помощью map ), и превратить это в параллельный код, не требуя дополнительной усилий от вас. Вы также можете указать параллельные разделы, используя pragma omp > директивы; в этом отношении она очень чувствует аналогично на Cython это поддержка OpenMP.
вы должны отметить, что этот проект молод, и вы можете столкнуться ошибки; следует также отметить, что команда разработчиков очень дружелюбна и, как правило, исправить ошибки в течение нескольких часов.
Я понимаю, что ответ на совершенно новое решение отсутствует. Если Numpy используется в коде, я бы посоветовал попробовать Pythran:
для функций, которые я пробовал, Pythran дает очень хорошие результаты. Полученные функции так же быстро, как и написанный код Fortran (или только немного медленнее) и немного быстрее, чем (довольно оптимизированное) решение Cython.
это также огромное преимущество по сравнению с Numba или другими проектами, основанными на компиляции just-in-time, для которой (насколько мне известно) вам нужно расширить циклы, чтобы быть действительно эффективными. И тогда код с петлями становится очень очень неэффективно использовать только CPython и Numpy.
недостаток Pythran: нет классов! Но поскольку компилировать нужно только те функции, которые действительно нужно оптимизировать, это не очень раздражает.
другой момент: Pythran поддерживает хорошо (и очень легко) параллелизм OpenMP. Но я не думаю, что mpi4py поддерживается.
Я знаю, что это старая тема, но я хотел дать то, что я думаю, чтобы быть полезной информацией.
Я лично использую PyPy, который очень прост в установке с помощью pip. Я взаимозаменяемо использую интерпретатор Python/PyPy, вам вообще не нужно менять свой код, и я обнаружил, что он примерно в 40 раз быстрее, чем стандартный интерпретатор python (либо Python 2x, либо 3x). Я использую pyCharm Community Edition для управления моим кодом, и мне это нравится.
Мне нравится писать код на Python, как я думаю, это позволяет вам сосредоточиться больше на задаче, чем на языке, что является огромным плюсом для меня. И если вам нужно, чтобы он был еще быстрее, вы всегда можете скомпилировать его в двоичный файл для Windows, Linux или Mac. По моему опыту, я получаю около 3.5 x ускорение над PyPy при компиляции, что означает 140x быстрее, чем python. PyPy доступен для кода Python 3x и 2x, и снова, если вы используете IDE, такую как PyCharm, вы можете очень легко обмениваться между PyPy, Cython и Python (требуется немного начального обучения).
некоторые люди могут спорить со мной по этому поводу, но я считаю, что Пайпи быстрее, чем Цитон. Хотя они оба отличный выбор.
Edit: Я хотел бы сделать еще одно краткое замечание о компиляции: когда вы компилируете, результирующий двоичный файл намного больше, чем ваш скрипт python, поскольку он строит все зависимости в него и т. д. Но тогда вы получаете несколько явных преимуществ: скорость!, теперь приложение будет работать на любой машине (в зависимости от того, для какой ОС вы скомпилировали, если не все. lol) без Python или библиотек он также запутывает ваш код и технически «готов к производству». Некоторые компиляторы также генерируют код C, который я действительно не смотрел или не видел, полезен ли он или просто тарабарщина. Удача.
Переписать код с питона на c++
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Перевести код с питона на С++
Здравствуйте помогите перевести код, пытаюсь но что-то совсем не то выходит. threshold = 0.5.
Входные данные
В первой строке содержится последовательность цифр. Цифр не более 100.
Выходные данные
Вывести одно число.
Примеры
входные данные
80946
выходные данные
1
входные данные
21705
выходные данные
3
полный текстassemberist,
80946 это «з иге». Как из этого набора получается 1?
21705 это «баж д». Как из этого набора получается 3?
тут нужно посчитать количество коллизий
80946 это «з иге» поэтому 1
21705 это либо «баж д» либо «уё д» либо «бп д» поэтому 3
Добавлено через 6 минут
// начнём со строки, результат которой нам известен
// ввод можно легко допилить и позже
// когда всё правильно заработает
// d скорее всего динамический массив
// размером в введённое значение
// на начальном этапе не будем заморачиваться динамикой
// создадим статический побольше
// начинаем заполнять массив, как в питоне
// дальше идёт цикл, я понял его так.
// поправьте, если кто в теме
1. 000000 аааааа
2. 000011 аааай
3. 000110 ааайа
4. 001100 аайаа
5. 001111 аайй
6. 011000 айааа
7. 011011 айай
8. 011110 аййа
9. 110000 йаааа
10. 110011 йаай
11. 111100 ййаа
12. 111111 ййй
Получилось 12 вариантов перестановок, вроде ничего не пропустил.
Математической закономерности не вижу, придётся колдовать с if-then-else.
Ну Питон крутой язык, в одну строчку такой алгоритм уместить!
C/C++ из Python (ctypes)
Про то как вызывать Python из C написал в прошлой статье, теперь поговорим как делать наоборот и вызывать C/C++ из Python3. Раз начал писать об этом, то раскроем всю тему до конца. Тем более, что ни чего сложного здесь нет тоже.
Здесь все просто, Python умеет вызывать C функции без каких либо проблем.
Исходник компилируется в динамическую библиотеку и готов к бою.
Переходим к Python. В примере показывается как передать аргументы функции, получить результат работы от функции, а так же как получить и изменить значения глобальных переменных.
Все возможные типы данных и их обозначения можно посмотреть в документации Python.
Работа со структурами
C — объявление структуры в test.h:
Функция по работе с нашей структурой:
Здесь немного сложнее, т.к. ctypes может только работать с C функциями. Это для нас не проблема, просто C обвяжем код C++.
Методы класса C++ и обвязка на C:
Но есть один нюанс, обвязку надо объявить как extern C. Чтобы ++ компилятор не перегрузил имена функций обвязки. Если он это сделает, то мы не сможем через ctypes работать с нашими функциями.
test.hpp:
С Python все так же просто.
Для подключения C++ библиотек к python-у:
Нужно если бы ./objs/libtestpp.so использовал функции из a.so & b.so. Без подключения интерпретатор не знал бы где их искать.
Плюсы и минусы ctypes
Плюсы:
Минусы:
Код постарался закомментировать понятно, чтобы здесь писать поменьше )
Надеюсь будет полезно.
Благодарность
DollaR84 за его помощь.
Palich239 за найденные ошибки.
Pythonnet. Как запустить C# код из Python
Введение
Однако бывают случаи, когда есть некая база кода, написанного на C#, а возможности быстро переписать всё на Python/C/C++ нет. Тогда встает вопрос “как подключить C# к Python?”. Для этого была разработана библиотека pythonnet. В этой статье разберем: как запустить C# код из Python и что из этого может получиться.
Реализация
Для сравнения скорости выполнения C# и Python я буду ссылаться на одну из прошлых статей.
В качестве примера будем использовать магазин из прошлой статьи, который оптимизировали силами самого питона и других языков. Создадим структуру для одного товара на C#:
Теперь реализуем класс самого магазина. В нем создадим метод для заполнения магазина товарами:
Далее разберемся с проектом на Python. Необходимо установить библиотеку pythonnet, выполнив команду:
В проекте создадим файл main.py, а также поместим библиотеку “MyTestCS.dll” в папку с проектом:
Теперь можно подключать библиотеку в main.py, для этого сначала импортируем clr (clr позволяет рассматривать пространства имен CLR как пакеты Python):
Чтобы подгрузить нужную нам библиотеку необходимо прописать следующий код:
После чего можно импортировать модуль и всё, что в нем содержится. Если напрямую сделать импорт MyTestCS:
То можно увидеть, что наш проект загрузился как модуль. Также можно напрямую импортировать необходимые данные, например, необходимые классы или структуры из проекта.
Создадим экземпляр класса ShopClass и DataGoods через Python и обратимся к полям этих классов.
Как итог, получилось вызвать код C# из Python и поработать с классами. Теперь протестируем производительность создания 200*100000 товаров через метод createShopClass:
В прошлой статье время создания такого количества товаров заняло примерно 44 секунды. Использование C# вместо Python позволило ускорить этот процесс примерно в 15 раз, что является очень хорошим результатом.
Проблемы
Однако не может же быть всё настолько хорошо, чтобы броситься переписывать куски кода Python на C#. И это так. Попробуем из Python вручную дополнить товарами магазин:
И проверим аналогичный код, написанный на Python:
Код чистого питона работает быстрее, чем дополнение объекта, созданного из модуля C#. Это связано с тем, что доступ к объектам, написанным на C#, занимает довольно много времени. Чтобы избежать таких проблем, необходимо писать всю логику работы с классом внутри C# кода, и не выносить эту логику в Python. Изменение скорости выполнения кода будет заметно при подсчете суммы всех товаров. Реализуем функцию подсчета суммы товаров на C# (внутри класса ShopClass):
Python код выполняется гораздо медленнее, чем внутренние методы C#.
Многопоточность
Так как в C# отсутствует GIL, то мне стало интересно протестировать работу многопоточности в C# и попробовать запустить потоки в C# через Python. Для начала протестируем протестируем создание 3х классов ShopClass последовательно и заполним их 3.000.000 товаров:
Python код для запуска:
Дополним класс testShop для работы с потоками новым методом:
И создадим новый вспомогательный класс:
Запустим Python код для проверки работы потоков:
Вывод
Использование частей кода, написанных на C# в Python возможно, но при таком подходе есть и свои минусы, например, скорость доступа к объектам. Использование pythonnet целесообразно, если имеются какие-то части кода, которые нет возможности переписать на Python, но они требуют подключения к основному проекту на Python.
Как правильно переписать часть кода с Python на Си?
Стоит задача переписать его на Си. Вот мои наработки:
Что нужно поправить в функции проверки на уникальность, чтобы все работало? Подскажите, пожалуйста, куда копать. Заранее спасибо
Квадратные скобки, на мой взгляд, необязательны.
Не уверен, что эта ветвь выполнится хотя бы раз.
Если стоит задача ускорить работу скрипта, то, на мой взгляд, проще переписать так:
Можете добавить сортировку по вкусу.
А у тебя пусто.
Как же так?
Если файлы отсортированы, то можно итерировать оба файла одновременно (с выравниванием позиции по значению), таким образом за один проход можно получить пересечение, без необходимости все загружать в память.
Если не сортированы, тогда загрузить в set’ы и выполнить пересечение, как посоветовали выше.
Эм. что это за char size? Почему тип int сравнивается с типом char?