繁体   English   中英

python c扩展标准差

[英]python c extension for standard deviation

我正在写一个交流扩展来计算他的标准偏差。 性能很重要,因为它将在大型数据集上执行。 从列表中获取项目后,我很难弄清楚如何获取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.");
}

您可能正在重新发明轮子。 有几种适用于Python的科学计算库,例如SciPyNumpy ,它们大多是C库的包装器,它们实现诸如标准差之类的功能。

获得item ,可以使用PyNumber_Float获得其float值:

PyObject* floatitem = PyNumber_Float(item);

现在,你需要检查和错误号( if(!floatitem) return 0 -或goto到您decref任何你可能在你的代码,如以前的部分,你的情况已经incref'd的地点list )。 如果没有错误, PyFloat_AsDouble将为您提供所需的double值,以供您在C代码循环的其余部分中使用:

double ditem = PyFloat_AsDouble(floatitem);

之后,您可以拒绝floatitem并按照自己的喜好进行floatitem 不必过多担心PyNumber_Float转换开销-如果您首先传递了一个float列表,则不会有任何问题;-)。 如果您仍然担心(如果有人确实通过了非浮点要求转换,则可能会PyFloat_Check如果您坚持使用,可以使用PyFloat_Check (但我建议至少使用特殊PyFloat_Check intlong项,除非您希望真正感到困惑和困惑)。不满意的用户;-)。 同样,我也强烈建议学习和使用PySequence_Fast和朋友,而不是通过特别要求列表而不是其他类型的序列来使用户惊讶!

只需提一下,几乎肯定有比编写C扩展更好的方法。

第一种选择是使用NumPy。 在您对另一个答案的评论中,您提到将列表转换为数组非常昂贵。 如果仅使用标准偏差计算是您处理数据的唯一位,则可能性很小。

除非如此, 否则我会去找Cython 是Cython和NumPy的比较。 在这种情况下,Cython的性能不如NumPy,但更重要的是,可以简单地更改为csum实现的代码以计算标准差。

您是否考虑过使用cython编写扩展名。 非常适合这类事情

此方法将受列表中项目数的限制。

另一种设计将保持运行总计,并让您添加积分,直到溢出双精度数为止。

如果要对大型数据集进行简单统计,则可以随机采样数据的一部分,并取其平均值和标准差。 这将具有近似的“标准误差”,并且您抽取的样本越多,样本量就越小。 如果不需要高精度的统计信息,则不需要读取所有数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM