On 2-Feb-09, at 9:21 AM, Hrvoje Niksic wrote:
It turns out that an even faster method of creating an array is by
using the fromstring() method. fromstring() requires an actual
string, not a buffer, so in C++ I created an std::vector<double>
with a contiguous array of doubles, passed that array to
PyString_FromStringAndSize, and called array.fromstring with the
resulting string. Despite all the unnecessary copying, the result
was much faster than either of the previous versions.
Would it be possible for the array module to define a C interface
for the most frequent operations on array objects, such as appending
an item, and getting/setting an item? Failing that, could we at
least make fromstring() accept an arbitrary read buffer, not just an
actual string?
Do you need to append, or are you just looking to create/manipulate an
array with a bunch of c-float values? I find As{Write/Read}Buffer
sufficient for most of these tasks. I've included some example pyrex
code that populates a new array.array at c speed. (Note that you can
get the size of the resulting c array more easily than you are by
using PyObject_Length). Of course, this still leaves difficult
appending to an already-created array.
def calcW0(W1, colTotal):
""" Calculate a W0 array from a W1 array.
@param W1: array.array of doubles
@param colTotal: value to which each column should sum
@return W0 = [colTotal] * NA - W1
"""
cdef int NA
NA = len(W1)
W0 = array('d', [colTotal]) * NA
cdef double *cW1, *cW0
cdef int i
cdef Py_ssize_t dummy
PyObject_AsReadBuffer(W1, <void**>&cW1, &dummy)
PyObject_AsWriteBuffer(W0, <void**>&cW0, &dummy)
for i from 0 <= i < NA:
cW0[i] = cW0[i] - cW1[i]
return W0
regards,
-Mike
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com