LINUX.ORG.RU

Что за магия кроется в pybind11?

 , , , ,


0

4

У меня есть библиотека на С++. Как-то решил от скуки попробовать написать тоже самое на чистом С часть 1, часть 2. Один из сценариев использования библиотеки – из Python, для С++ я использовал pybind11, а для С попробовал разные варианты (ctypes, cffi, cython) и даже сделал сравнение. Почему-то при том, что между нативными версиями С и С++ разница практически нет, разница между pybind11 и ctypes/cffi ощутимая. Понятно, что при использовании через Python скорость это не самое главное, потому и забыл я про это после эксперимента. Но время от времени я вспоминаю и любопытство гложет. Сам нагуглить я не смог в чём кардинальная разница между pybind11 и cffi/ctypes. Может кто знает?

З.Ы. часто сталкивался в интернете с рекомендацией использовать cython для связки с С библиотеками как самый быстрый способ. Если с cffi/ctypes накидать обвязку было делом простым – накидать несколько строк по аналогии с примерами в мануале, то с cython я мучался несколько дней. А в итоге производительность оказалось куда ниже, чем с cffi/ctypes. Может здесь что-то не так сделал. Так что за советы по cython тоже скажу спасибо.

Ответ на: комментарий от t184256

Пусть покажет

но зачем ты это мне говоришь? вот, ему бы и говорил в первейшем комментарии :-P

aol ★★★★★
()

Ты в cython всю его обвязку чтоль зафигачил и дергаешь ее в цикле? Там 2.5к строк жеж. Ясен пень оно самое медленное. Там куча всякой фигни для типов, исключений и прочего

upcFrost ★★★★★
()
Ответ на: комментарий от t184256

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

upcFrost ★★★★★
()
Ответ на: комментарий от t184256
$ cython -a cython/segy_cython.pyx 
/usr/lib64/python3.11/site-packages/Cython/Compiler/Main.py:369: FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: /home/andalevor/Programming/segy_read_bench/cython/segy_cython.pyx
  tree = Parsing.p_module(s, pxd, full_module_name)

Второй модуль даёт такой же выхлоп. Но понятнее не стало. Если расшифруете немного, буду благодарен.

andalevor ★★★
() автор топика
Ответ на: комментарий от andalevor

HTML с результатом покажи.

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

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от upcFrost

Если сможете показать как не надо делать и как надо, будет здорово. Я вроде бы пытался следовать примерам из маунала.

andalevor ★★★
() автор топика
Ответ на: комментарий от andalevor

Суть - сайтон это не «биндинги к сишке», это замена пистона на пистоноподобный язык, транслируемый в сишку. Применение как я его вижу (хз видят ли его так все или нет, пофиг) - когда нужно быстродействие либо нужно подряд дофига сишных вызовов, а вся команда питонисты. И главное - все типы должны быть известны заранее, иначе ты будешь бегать в питон на каждый чих

Там есть тонна дополнительной обвязки типа «обработать исключение», «получить типы», «плюнуть текст в консоль», и в своём коде ты по сути ходишь по циклу из этих граблей. Решение - определить все типы, убрать instanceof и прочие питоноспецифичные вызовы (грубо говоря все что в стандартной либе либо все что связано с питонячьими типами), заранее приготовить все encode, засунуть цикл в сайтон целиком. Будет сильно бодрее

upcFrost ★★★★★
()
Последнее исправление: upcFrost (всего исправлений: 5)
Ответ на: комментарий от andalevor

Жеваный крот. Теперь когда берёшь из этого всю динамику и код станет белым, тогда придёт время сравнивать производительность.

t184256 ★★★★★
()
Ответ на: комментарий от upcFrost

Просто, когда я изучал вопрос и гуглил кто что использует для этой задачи, натолкнулся на один ответ на SO. Человек предупреждает, что он разработчик cython и потом очень убедительно пишет о том, что cython со всех сторон лучше, чем альтернативы. Я допускал, что т.к. мой код постоянно из питона бегает в cython, результаты могут не превзойти ctypes, но то что он будет медленнее в разы, я тоже не ожидал после такой рекламы.

andalevor ★★★
() автор топика
Ответ на: комментарий от andalevor

Я допускал, что т.к. мой код постоянно из питона бегает в cython результаты могут не превзойти ctypes

До прочтения документации, правда ведь? В которой в первом же предложении написано, что это язык написания C extensions, а уже на четвёртой — заветные картинки с жёлтыми строчками?

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

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от andalevor

По ссылке он имел ввиду что ты можешь весь py-файл сделать pyx вообще без изменений, а потом постепенно добавлять оптимизации вроде статической типизации. Он немного лукавит конечно, «вообще любой» код так обернуть не выйдет, но для 95% случаев он вполне прав.

upcFrost ★★★★★
()
Ответ на: комментарий от andalevor

Предлагаю сохранить результат в формате SVG. Его можно открыть в браузере, наводить мышь на прямоугольники и во всплывающей подсказке видеть имя функции кот. заняла время. Чем шире прямоугольник тем больше времени заняла функция.

imatveev13
()
Последнее исправление: imatveev13 (всего исправлений: 1)
Ответ на: комментарий от imatveev13

Результат и есть в svg формате. Просто картинку в png залил. Другой вариант вывода perf.

ctypes pybind11

Много unknown, хотя обе библиотеки собрал с предложенными в статье опциями. Возможно надо и сам питон с ней собрать. Однако на картинке с библиотекой для С моё внимание привлёк вызов fetestexcept. Если я правильно понимаю, то программа прилично времени потратила на эти вызывовы. Я эту функцию не использовал. И вообще о такой функции не знал пока не загуглил. Видимо, это часть С биндингов питона.

andalevor ★★★
() автор топика
Ответ на: комментарий от upcFrost

Понимаю. Изначально когда читал примеры из документации меня захватила идея писать в py с аннотациями, а потом использовать cython но даже для моего небольшого примера это не сработало и пришлось писать на cython. Наверное, «ваши ожидания это ваши проблемы». Думаю, товарищ выше прав и если в питоне оставить do_it() в py, а всё остальное вынести в cython, то будет быстрее, но мне питон нужен только из-за numpy, scipy и matplotlib. Но информация в любом случае плезная. Попробую на досуге избавиться от жёлтого и посмотреть на сколько это может быть мне полезно. Спасибо.

andalevor ★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.