[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
=================