2013-11-28 4 views
2

Я только что начал C и пытаюсь сделать бэкэндом для своего питона. На данный момент у меня есть громоздкая система записи огромных входных файлов (по крайней мере 10^6 поплавков) из python, а затем инициализация C (которая также должна загружаться множеством других данных), запускающих C до завершения, получая свой вывод только для повторной инициализации его с помощью нового массива ввода.Numpy массивы в C

Я не уверен, если это концептуально возможно оглядеться, но я надеялся просто направить C на адрес памяти для массива numpy и использовать его, как если бы это массив, созданный C Задача состоит в том, чтобы python инициализировал C, построил свой первый массив, запустил C-код, пока он не будет готов для следующего массива, который затем будет сгенерирован python.

Это какой-то фиктивный код, который я написал, чтобы попытаться получить C для чтения массивов numpy. На данный момент у C есть ошибка сегментации, и я не уверен, что из-за того, что я плохо на C, мне не нравится читать массивы numpy или немного того и другого.

Front.py

array_interface был из here.

#! /usr/bin/python 

import numpy as np 
import subprocess as sp 

ray = np.array([x*3.14 for x in range(10)]) 
addr = ray.__array_interface__['data'][0] 

pro = sp.Popen(['./back', hex(addr)]) 
print pro.communicate()[0] 
print ray[:5] 
quit() 

Back.c

#include <stdio.h> 
#include <stdlib.h> 

int main(char *argv[]) 
{ 
    float *addr; 
    int n; 
    float a[10]; 

    // Hopefully making a pointer to the first float in the np.ndarray 
    addr = sscanf(argv[1], "%x"); 

    n = 0; 
    while(n<10) 
    { 
    // Hopefully stepping through the np.ndarray one float at a time. 
    a[n] = *addr; 
    addr++; 
    n++; 
    } 
    // Return the first five values to compare with python. 
    fprintf(stdout, '%f %f %f %f %f\n', a[0], a[1], a[2], a[3], a[4]); 
    return 0; 
} 

Можно ли иметь C чтения Numpy массивы, как это или этот подход в корне ошибочным? Есть ли лучший способ сделать это? если это работает, можно ли использовать Ctype bool, чтобы оба процесса знали адрес, чтобы координировать, какой процесс работает и который ждет? например python устанавливает значение в 1, поскольку он инициализирует массив numpy - C ждет ожидания за какое-то время (sp_bool == 1). Затем, когда python завершен, он меняет значение на 0, а C выполняет, наконец, меняя значение на 1, когда оно заканчивается.

+0

Я не знаю, что такое Python, чтобы узнать, есть ли способ, но есть один, это будет непроцессорное решение, а не внеочередное решение, как то, что вы сейчас делаете. Не удается ли Python вызвать код C из файлов '.so'? – Medinoc

+0

Кстати, даже если это может сработать, вы не используете sscanf() правильно: он возвращает количество проанализированных значений, а не само значение. – Medinoc

+0

Вы можете встроить Python в свое приложение C (http://docs.python.org/3/c-api/intro.html#embedding-python). –

ответ

0

Похоже, что лучшим вариантом может быть вызов кода C из python. Мало того, что это очень возможно, на самом деле так написано numpy. Numpy в основном написана на C, поэтому, когда вы делаете np.add(array1, array2) python передает array1 и array2 на C-код numpy, код C создает выходной массив для результатов, добавляет элементы входных массивов, помещая результат в выходной массив, и возвращает выходной массив.

Я думаю, что самый простой способ сделать ваш код C доступным в python - обернуть его с помощью cython. Вот два учебника, которые, надеюсь, заставят вас двигаться в правильном направлении. How to call existing C code from cython и how to use numpy arrays in cython.

Также следует упомянуть, что вы можете получить доступ к массивам numpy из кода C, используя numpy c api, это, вероятно, будет сложнее для вас, чем использование cython, потому что вы новичок в C, но это другой способ пойти, если вы выбрали этот маршрут ,

Смежные вопросы