我是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
这是我的任务管理器显示内存使用情况的图片:
>>> import hash
import hash
完成导入完成后我可以使用我的模块,它运行良好,但内存似乎有点高。
对我来说, PyModule_Create 似乎做了非常大的内存分配。但我很确定在其他模块中不会发生这种情况。
我错过了什么吗?
修改:
当我已经使用大量RAM(超过2.5Go / 4Go)时,我收到此错误:
>>> import hash
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
>>>
答案 0 :(得分:0)
由于Python使用垃圾收集器,因此无需在任何特定时间释放内存,您可能会看到优化的实际效果。