2016-12-04 17 views
0

python(手段python3)を使用してデータを準備する(ワイヤーSPIに送信する場合もある)ための実験を行うと、速度が遅い(システムが限られている)ことが示されます。だから、私はCで書かれた拡張モジュールの作成を考えていました。私は希望のいずれか:拡張モジュール:void *からbytearrayへのマーケティング

  • うまくいけばpythonで作成しbytearrayオブジェクトへのポインタを取得しますbytearray
  • 拡張モジュールに、うまくいけば透過的に転換拡張モジュールでmalloc()によって作成されたメモリブロックへのアクセスを持っているでしょうpythonスクリプト透過的に転換void *

に目標はとして(両方pythonでアクセスゼロ変換メモリブロックとしてもゼロコピーを持つことです)および拡張モジュール(void *など)。

これを達成する方法はありますか?

答えて

0

OK、;-)

  • bytearraybytearrayを抽出するための書式指定子がある
  • 必要とされている正確に何である、基本的なメモリ・ブロックにアクセスするための直接的なサポートを提供して予想よりも簡単であると思われます関数呼び出しの引数リストからオブジェクト

C拡張モジュール[test.c]:

#include <Python.h> 
#include <stdint.h> 

/* Forward prototype declaration */ 
static PyObject *transform(PyObject *self, PyObject *args); 

/* Methods exported by this extension module */ 
static PyMethodDef test_methods[] = 
{ 
    {"transform", transform, METH_VARARGS, "testing buffer transformation"}, 
    {NULL, NULL, 0, NULL} 
}; 


/* Extension module definition */ 
static struct PyModuleDef test_module = 
{ 
    PyModuleDef_HEAD_INIT, 
    "BytearrayTest", 
    NULL, 
    -1, 
    test_methods, 
}; 


/* 
* The test function 
*/ 
static PyObject *transform(PyObject *self, PyObject *args) 
{ 
    PyByteArrayObject *byte_array; 
    uint8_t   *buff; 
    int    buff_len = 0; 
    int    i; 


    /* Get the bytearray object */ 
    if (!PyArg_ParseTuple(args, "Y", &byte_array)) 
     return NULL; 

    buff  = (uint8_t *)(byte_array->ob_bytes); /* data */ 
    buff_len = byte_array->ob_alloc;    /* length */ 

    /* Perform desired transformation */ 
    for (i = 0; i < buff_len; ++i) 
     buff[i] += 65; 

    /* Return void */ 
    Py_INCREF(Py_None); 
    return Py_None; 
} 


/* Mandatory extension module init function */ 
PyMODINIT_FUNC PyInit_BytearrayTest(void) 
{ 
    return PyModule_Create(&test_module); 
} 

C拡張モジュールのビルド/展開スクリプト[setup.py]:

# ./setup.py build 
# ./setup.py install 

テストそれ::

#!/usr/bin/python3 
from distutils.core import setup, Extension 

module = Extension('BytearrayTest', sources = ['test.c']) 

setup (name = 'BytearrayTest', 
     version = '1.0', 
     description = 'This is a bytearray test package', 
     ext_modules = [module]) 

ビルド/拡張モジュールをインストールします

>>> import BytearrayTest >>> a = bytearray(16); a bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> BytearrayTest.transform(a); a bytearray(b'AAAAAAAAAAAAAAAA') >>> 
関連する問題