C Python模块具有不寻常的内存使用

时间:2015-07-10 07:38:57

标签: c python-3.x python-module

我是Python C-API和模块创建的新手。我试图创建一个c-hash python模块。 我使用python 3.4.3和TDM-gcc(64bit)4.9.2进行Windows上的编译。

这是我的代码:

// hash_mod.c
#include <Python.h>

unsigned long _hash(unsigned char const* str)
{
    unsigned long hash = 5381;
    int c;
    int i;

    i = 0;
    while (str[i] != '\0')
    {
        c = str[i];
        hash = ((hash << 5) + hash) + c;
        ++i;
    }

    return hash;
}

static PyObject*
hash_hash(PyObject* self, PyObject* args)
{
    unsigned char const* str;

    if (!PyArg_ParseTuple(args, "s", &str))
        return NULL;

    return PyLong_FromUnsignedLong(_hash(str));
}

static PyMethodDef HashMethods[] = {
    {"hash", hash_hash, METH_VARARGS, "String Hash"},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef HashModule = {
   PyModuleDef_HEAD_INIT,
   "hash",
   NULL,
   -1,
   HashMethods,
   NULL,
   NULL,
   NULL,
   NULL
};

PyMODINIT_FUNC
PyInit_hash(void)
{
    return PyModule_Create(&HashModule);
}

setup.py:

# setup.py
from distutils.core import setup, Extension

module1 = Extension('hash', sources = ['hash_mod.c'])

setup (name = 'Hash',
        version = '1.0',
        description = 'String Hash',
        ext_modules = [module1])

编译效果很好但是当我尝试在解释器中导入我的哈希模块时,我的内存会大大超出 python.exe 进程的 2Go

这是我的任务管理器显示内存使用情况的图片:

  1. >>> import hash
  2. import hash完成
  3. 退出python口译员
  4. 导入完成后我可以使用我的模块,它运行良好,但内存似乎有点高。

    对我来说, PyModule_Create 似乎做了非常大的内存分配。但我很确定在其他模块中不会发生这种情况。

    我错过了什么吗?

    修改

    当我已经使用大量RAM(超过2.5Go / 4Go)时,我收到此错误:

    >>> import hash
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    MemoryError
    >>>
    

1 个答案:

答案 0 :(得分:0)

由于Python使用垃圾收集器,因此无需在任何特定时间释放内存,您可能会看到优化的实际效果。