Способ передать миллионы элементов в программе на Python в программу на C много раз в быстрой последовательности

Я написал скрипт на Python, который должен передать миллионы элементов программе на C и получить результат много раз за короткий период (переход от 1 до 10 данные о миллионах вершин (целочисленный индекс и 2 координаты с плавающей запятой) быстро 500 раз, и каждый раз, когда скрипт python вызывает программу C, мне нужно сохранять возвращаемые значения в переменных). Я уже реализовал способ чтения и записи текстовых и / или двоичных файлов, но он медленный и неумный (зачем записывать файлы на жесткий диск, если вам не нужно хранить данные после завершения скрипта python?). Я пробовал использовать трубы, но для больших данных мне выдали ошибки ... Итак, к настоящему времени я думаю, что лучший способ - использовать способность ctypes загружать функции в .dll. Поскольку я никогда не создавал dll, я хотел бы знать, как ее настроить (я знаю, что у многих ide есть шаблон для этого, но мой wxdev-c ++ вылетает, когда я пытаюсь его открыть. Сейчас я загружаю код :: Blocks)

Можете ли вы сказать мне, правильное ли решение, которое я начинаю реализовывать, или есть лучшее решение? Две функции, которые мне нужно вызвать в python, - это

void find_vertex(vertex *list, int len, vertex* lower, vertex* highter)
{
    int i;
    *lower=list[0];
    *highter=list[1];
    for(i=0;i<len;i++)
    {
        if ((list[i].x<=lower->x) && (list[i].y<=lower->y))
            *lower=list[i];
        else
        {
            if ((list[i].x>=highter->x) && (list[i].y>=highter->y))
                *highter=list[i];
        }
    }
}

и

vertex *square_list_of_vertex(vertex *list,int len,vertex start, float size)
{
    int i=0,a=0;
    unsigned int *num;
    num=(int*)malloc(sizeof(unsigned int)*len);
    if (num==NULL)
    {
        printf("Can't allocate the memory");
        return 0;
    }
    //controlls which points are in the right position and adds their index from the main list in another list
    for(i=0;i<len;i++)
    {
        if ((list[i].x-start.x)<size && (list[i].y-start.y<size))
        {
            if (list[i].y-start.y>-size/100)
            {
                num[a]=i;
                a++;//len of the list to return
            }
        }
    }

    //create the list with the right vertices
    vertex *retlist;
    retlist=(vertex*)malloc(sizeof(vertex)*(a+1));
    if (retlist==NULL)
    {
        printf("Can't allocate the memory");
        return 0;
    }
    //the first index is used only as an info container
    vertex infos;
    infos.index=a+1;
    retlist[0]=infos;

    //set the value for the return pointer
    for(i=1;i<=a;i++)
    {
        retlist[i]=list[num[i-1]];
    }

    return retlist;
}

EDIT: забыл опубликовать определение типа вершины

typedef struct{
    int index;
    float x,y;
} vertex;

EDIT2: Я буду распространять код, поэтому я предпочитаю не использовать внешние модули в python и внешние программы на C. Alsa я хочу попытаться сохранить кроссплатформенный код. Скрипт является дополнением к 3D-приложению, поэтому чем меньше он использует внешние "вещи", тем лучше.

5
задан Makers_F 14 February 2011 в 22:48
поделиться