Python C-API ve modül oluşturma konusunda çok yeni. Bir c-hash python modülü oluşturmaya çalıştım. Windows'ta derleme için python 3.4.3 ve TDM-gcc (64bit) 4.9.2 kullanıyorum. İşteC Olağandışı bellek kullanımına sahip Python Modülü
kodum:
// 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: Ben tercüman benim karma modülü almaya çalıştığınızda
# 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])
derleme iyi çalışıyor ama, hafızam büyük bir sıçrayış python.exe işlemi için 2Go'dan daha fazla işlem. İşte
bellek kullanımını gösteren benim görev yöneticisi bir fotoğrafı:>>> import hash
- benim modülünü kullanabilirsiniz
import hash
bitirmek - Çık piton tercüman
ithalat bitirmek sonra ve iyi çalışıyor ama hafıza biraz yüksek gibi görünüyor.
Bana göre PyModule_Create gerçekten büyük bir bellek ayırma yapıyor. Ama eminim ki diğer modüllerde bu olmadı.
Bir şey mi özledim?
Düzenleme:
Python gibi>>> import hash
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
>>>
Bu, genellikle bir değer arttığında olur. Modül başlatıldığında, döngüde olan her şeyin değerini kontrol ederim. – IronManMark20
Python'un 64bit sürümünü kullanırken sorun çıkıyor gibi görünüyor. 32bit sürümünü kullanarak herhangi bir sorunum yok. – Imp
Bu sorunu Linux x86 üzerinde yeniden oluşturamıyorum. Bir sökme yardımcı olacaktır. –