[PYTHON MATRIX-SIG] A related idea
James Hugunin
jjh@mama-bear.lcs.mit.edu
Tue, 7 Nov 95 09:56:39 -0500
> Suppose we have the matrix class working.
What do you mean suppose ;) ?
> Suppose there is a Fortran
> or C array in the program which you would like to "adopt" as a
> matrix in Python. The only difference between this and a matrix created a
> normal way is that you have to remember never to free the memory.
> So it seems you might be able to do this if you had a method
> of creation (from C) which took a pointer,size,type kind of
> description. You could then increment the reference counter one extra, so
> that the memory is never freed, or a "don't free" flag could be in the
> header.
I agree that there should be a function to create a new matrix object from
an existing array in C (or FORTRAN). What we disagree about is the
semantics. I played around a while with the idea of "sharing" an array
between python and C. I found that as a general rule I ran into memory leak
problems (or worse). Using your scheme, python is never responsible for
freeing the allocated memory, this means that the C code must be responsible
for it, but the C code can't know when it is safe to free the memory
because even when it's done with it there might still be a python reference
to the memory.
Let me know if I'm completely missing something here, and this memory leak
issue isn't really a problem.
I made the general decision to completely avoid these sorts of issues by
(almost) never returning arrays that are references to other arrays. I
found that doing a malloc and a memcpy is usually sufficiently faster than
any operation I'm going to perform on the array that it could be ignored.
In order for this to be a valid assumption, I need to be working on a system
where I have "more than enough" memory hanging around. This is always true
for me, but I'm interested in cases where it's not.
Note: the following will be completely meaningless to you if you haven't
played with the alpha matrix object, so please ignore.
---
I'd add the following function to do what you're suggesting, but using my
semantics (this is off the top of my head, so there're no guarantees it will
work).
PyObject *PyMatrix_FromDimsAndData(int nd, int *dimensions, char type, void
*data) {
PyMatrixObject *ret = PyMatrix_FromDims(nd, dimensions, type);
memcpy(ret->data, data, NBYTES(ret));
return (PyObject *)ret;
}
I'll add something like this to the next release.
-Jim
=================
MATRIX-SIG - SIG on Matrix Math for Python
send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org
=================