Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
标准偏差的python c扩展_Python_C_Performance_Standard Deviation - Fatal编程技术网

标准偏差的python c扩展

标准偏差的python c扩展,python,c,performance,standard-deviation,Python,C,Performance,Standard Deviation,我正在写一个c扩展来计算标准偏差。性能非常重要,因为它将在大型数据集上执行。一旦我从列表中获取了项目,我就很难弄清楚如何获取pyobject的值。这是我第一次为python编写c扩展,非常感谢您的帮助。显然,我不知道如何正确使用代码示例按钮:( 这就是我到目前为止所做的: #include <Python.h> static PyObject* func(PyObject *self, PyObject *args) { PyObject *list, *item;

我正在写一个c扩展来计算标准偏差。性能非常重要,因为它将在大型数据集上执行。一旦我从列表中获取了项目,我就很难弄清楚如何获取pyobject的值。这是我第一次为python编写c扩展,非常感谢您的帮助。显然,我不知道如何正确使用代码示例按钮:(

这就是我到目前为止所做的:

    #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.");
}
#包括
静态PyObject*
func(PyObject*self,PyObject*args)
{
PyObject*列表,*项;
佩西,莱恩;
if(!PyArg_unpactuple(args,“func”、1、1和list)){
返回NULL;
}
printf(“hello world\n”);
Py_增量(列表);
len=PyList\u GET\u尺寸(列表);

对于(i=0;i您可能正在重新发明轮子。有几种Python科学计算库,如和,它们主要是围绕C库的包装器,实现标准偏差等函数。

您可能正在重新发明轮子。有几种Python科学计算库,如和,它们是mos它是围绕C库的一种包装,实现标准偏差等功能。

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


另一种设计将保持一个运行总数,并允许您添加点数,直到溢出双精度。

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


另一种设计将保持一个运行总数,并允许您添加点数,直到您溢出双精度。

一旦您拥有
,您可以通过以下方式获得其浮点值:

现在,您需要检查并退出错误(
如果(!floatitem)返回0
--或
goto
到一个位置,在该位置,您可以减少代码前一部分中可能增加的任何内容,例如在您的情况下
列表
)。如果没有错误,则为您提供所需的
double
值,以便在C代码循环的其余部分中使用:

double ditem = PyFloat_AsDouble(floatitem);

在这之后,您可以减少
floatitem
并尽情享受。不要过分担心
PyNumber\u Float
中的转换开销——如果您首先通过了一个Float列表,则不会有任何转换开销;-)。如果您仍然担心(如果有人通过了需要转换的非Float列表,则宁愿给出一个错误)如果您坚持,您可以使用
PyFloat\u Check
(但我建议至少使用特殊的大小写
int
long
项,除非您想要真正困惑和不高兴的用户;-).同样,我也强烈建议学习和使用和朋友,而不是通过特别要求列表而不是其他类型的序列来震惊用户!-)。

一旦你有了
项,你可以通过以下方法获得其浮点值:

现在,您需要检查并退出错误(
如果(!floatitem)返回0
--或
goto
到一个位置,在该位置,您可以减少代码前一部分中可能增加的任何内容,例如在您的情况下
列表
)。如果没有错误,则为您提供所需的
double
值,以便在C代码循环的其余部分中使用:

double ditem = PyFloat_AsDouble(floatitem);

在这之后,您可以减少
floatitem
并尽情享受。不要过分担心
PyNumber\u Float
中的转换开销——如果您首先通过了一个Float列表,则不会有任何转换开销;-)。如果您仍然担心(如果有人通过了需要转换的非Float列表,则宁愿给出一个错误)如果您坚持,您可以使用
PyFloat\u Check
(但我建议至少使用特殊的大小写
int
long
项,除非您想要真正困惑和不高兴的用户;-).同样,我也强烈建议学习和使用和friends,而不是通过特别要求列表而不是其他类型的序列来震惊用户!-)。

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

第一种选择是使用NumPy。在您对另一个答案的评论中,您提到将列表转换为数组的成本很高。如果标准偏差计算是您对数据进行的唯一一项极不可能的操作,则可能会出现这种情况


除此之外,我想对Cython和NumPy进行比较。在这种情况下,Cython的性能不如NumPy,但更重要的是,为
csum实现的代码可以简单地更改以计算标准偏差。

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

第一种选择是使用NumPy。在您对另一个答案的评论中,您提到将列表转换为数组的成本很高。如果标准偏差计算是您对数据进行的唯一一项极不可能的操作,则可能会出现这种情况


除此之外,我想比较一下Cython和NumPy。在这种情况下Cython的性能不如NumPy,但更重要的是,为csum实现的代码可以简单地更改以计算标准偏差。

您是否考虑过使用来编写扩展。它非常适合这种类型的东西

您有没有合作过n用于编写扩展。它非常适合这种类型的东西

如果您想要对大型数据集进行简单的统计,您可以随机抽样数据的一个子集,并取其平均值和标准偏差。这将有一个“标准误差”如果你不需要高精度的统计数据,你就不需要读取所有的数据。

如果你想对大数据集进行简单的统计,你可以随机抽取数据的一个子集,并取其平均值和标准偏差。这将有一个近似值的“标准误差”,采样越多,误差越小。如果不需要高精度的统计数据,就不需要读取所有数据。

我目前正在使用numpy进行c