1

標準偏差を計算するための ac 拡張を書いています。大規模なデータセットに対して実行されるため、パフォーマンスは重要です。リストから項目を取得したら、pyobject の値を取得する方法を理解するのに苦労しています。Python 用の ac 拡張機能を作成するのはこれが初めてで、どんな助けも大歓迎です。どうやら私はコードサンプルボタンを正しく使用する方法を知りません:(

これは私がこれまでに持っているものです:

    #include <Python.h>
static PyObject*
func(PyObject *self, PyObject *args)
{
  PyObject *list, *item;
  Py_ssize_t i, len;
  if (!PyArg_UnpackTuple(args, "func", 1, 1, &list)){
    return NULL;
  }
  printf("hello world\n");
  Py_INCREF(list);
  len = PyList_GET_SIZE(list);
  for (i=0;i<len;i++){
    item = PyList_GET_ITEM(list, i);
    PyObject_Print(item,stdout,0);
  }
  return list;
}

static char func_doc[] = "This function calculates standard deviation.";

static PyMethodDef std_methods[] = {
  {"func", func, METH_VARARGS, func_doc},
  {NULL, NULL}
};

PyMODINIT_FUNC
initstd(void)
{
  Py_InitModule3("std", std_methods, "This is a sample docstring.");
}
4

6 に答える 6

4

あなたは車輪の再発明をしているかもしれません。SciPyNumpyなど、Python 用の科学計算ライブラリがいくつかあります。これらはほとんどが C ライブラリのラッパーであり、標準偏差などの関数を実装しています。

于 2010-08-03T23:36:40.970 に答える
1

を取得したらitem、その float 値をPyNumber_Floatで取得できます。

PyObject* floatitem = PyNumber_Float(item);

ここで、エラーをチェックして終了する必要があります(if(!floatitem) return 0-- または、gotoコードの前の部分で incref した可能性のあるものを deref する場所に移動します。たとえば、あなたの場合list)。エラーがなければ、PyFloat_AsDoubledoubleは残りの C コード ループで使用するために必要な値を提供します。

double ditem = PyFloat_AsDouble(floatitem);

その後、逆参照して、思い通りfloatitemに進むことができます。変換のオーバーヘッドについてはあまり心配しないでくださいPyNumber_Float-- 最初に float のリストが渡された場合は何もありません;-)。それでも心配な場合 (誰かが変換を必要とする非 float を渡した場合にエラーを発生させたい場合)、主張する場合は使用できます (ただし、本当に困惑して不幸なユーザーが必要でない限りPyFloat_Check、少なくとも特別なケースintとアイテムをお勧めします; long-)。同様に、他のタイプのシーケンスではなくリストを明確に要求してユーザーを驚かせるよりも、PySequence_Fastとその仲間を研究して使用することを強くお勧めします!-)。

于 2010-08-04T00:02:22.983 に答える
1

C 拡張機能を作成するよりも優れた方法があることはほぼ確実です。

最初のオプションは、NumPy を使用することです。他の回答に関するコメントで、リストを配列に変換するのは費用がかかると述べています。これは、標準偏差の計算が、非常にありそうにないデータで行っている唯一のビットである場合に当てはまります。

それがなければ、私はCythonに行きます。Cython と NumPy の比較を次に示します。この場合、Cython は NumPy よりもパフォーマンスが劣りますが、さらに重要なのはcsum、標準偏差を計算するために実装されたコードを簡単に変更できることです。

于 2010-08-04T00:06:55.953 に答える
1

cythonを使用して拡張機能を作成することを検討しましたか。こんなタイプにぴったりです

于 2010-08-04T00:07:43.887 に答える
0

この方法は、リスト内のアイテムの数によって制限されます。

別のデザインでは、現在の合計を維持し、ダブルをオーバーフローするまでポイントを追加できます。

于 2010-08-03T23:37:30.750 に答える
0

大規模なデータセットの単純な統計が必要な場合は、データのサブセットをランダムにサンプリングし、その平均と標準偏差を取得できます。これには近似の「標準誤差」があり、取得するサンプルが多いほど、それは小さくなります。高精度の統計が必要ない場合は、すべてのデータを読み取る必要はありません。

于 2010-08-04T00:25:59.590 に答える