Вот рабочий пример.
import pandas as pd
import random
a = random.sample([0,1]*5, 10)
b = random.sample([0,1]*5, 10)
ab = random.sample([0,1]*5, 10)
bc = random.sample([0,1]*5, 10)
df = pd.DataFrame({'A':a,'B':b, 'AB':ab,'BC':bc})
df
A B AB BC
0 0 1 1 0
1 1 0 0 1
2 0 1 0 0
3 1 0 1 1
4 0 1 1 0
5 0 0 1 1
6 1 1 0 0
7 1 0 0 0
8 0 0 0 1
9 1 1 1 1
df[(df['A']==df['AB']) & (df['B']==df['BC'])]
Выходные данные представляют собой новый фрейм данных с наблюдениями, которые соответствуют установленным критериям.
Вы хотите посмотреть на использование XS, который является, как Perl обычно взаимодействует через интерфейс с библиотеками C/C++. Это не совсем тривиально. Несколько соответствующих частей документации Perl:
Можно назвать код из других библиотек через Встроенный:: C (и вероятно то же через Встроенный:: CPP) - взглянули на Встроенный:: C:: Поваренная книга. Скорее всего, Вы хотите начать со Встроенным и после того, как Вы будете сделаны, экспериментируя использование получающийся.XS файл для работы далее.
Необходимо создать функцию обертки, которая является вызываемой от жемчуга и AFAIK, у Вас должна будет быть эта функция обертки быть в динамической библиотеке (если Вы не соберетесь восстановить двоичный файл жемчуга и связать статический lib с ним). Мне нравится использовать инструмент под названием БОЛЬШОЙ ГЛОТОК (Простой Генератор Интерфейса Обертки) для создания оберток для меня. Это может создать обертки приблизительно для 17 других языков также.
Во-первых, это действительно должно быть в динамической библиотеке, не статической библиотеке (если Вы не перекомпилируете сам жемчуг и свяжете его против Вашей статической библиотеки).
Во-вторых, так как C++ исказит имена (одна из самых раздражающих "Функций" C++, если Вы спросите меня), то Вам будет нужен экстерн "C" блок, который содержит функции рычага. При использовании C++, Вы могли бы, вероятно, обойтись единственной функцией рычага, которая возвращает объект C++, который реализует интерфейс, который необходимо использовать. Так как Вы используете жемчуг, Вы, возможно, должны перенести объект в интерфейс как это:
CPPObject object; extern "C" { int InitObject( void ) { return object.init(); } int DoCoolStuff( void ) { return object.DoCoolStuff(); } int DoOtherCoolStuff( int foo ) { return object.DoOtherCoolStuff( foo ); } int DestroyObject( void ) { return object.Destroy(); } }
Вероятно, не, что Вы думаете, но как насчет того, чтобы писать автономной программе C++, с которой программа жемчуга связывается через каналы?
Я только начинаю переносить голову вокруг XS, таким образом, я не могу предложить много справки. Но вот то, что я действительно знаю...
Существует XSpp, который является XS для C++. Это распределяется с WxPerl. WxPerl находится в процессе активного и быстро реагирующего развития.
Inline:CPP может использоваться для написания первоначального кода интерфейса/обертки. Затем можно проанализировать сгенерированный XS. Однако это не выглядит так хорошо maintianed. Если это работает, это может предоставить Вам хорошее преимущество.
Вы могли бы найти это короткое примечание по XS и C++ John Keiser полезным, если немного датированный.