Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Python: Python

struct.Struct random access

 

 

Python python RSS feed   Index | Next | Previous | View Threaded


castironpi at gmail

Aug 26, 2008, 12:37 PM

Post #1 of 5 (73 views)
Permalink
struct.Struct random access

I'd like to seriously nominate this idea and get a considered opinion
on it.

struct.Struct lets you encode Python objects into structured memory.
It accepts a format string, and optionally a buffer and offset to/from
which to read/write the structure. What do you think of random access
to the results? To avoid Marc's concern about meaningless anonymous
record entries, model the constructor after 'namedtuple' type.

(unproduced)
>>> packer= struct.Struct( 'IIIf255p', 'i1 i2 i3 afloat name' )
>>> packer.pack_into( buf, off, 10, 20, 30, 0.5, 'abc' )
>>> packer.unpack_from( buf, off, 'i3' )
30
>>> packer.unpack_from( buf, off )
( 10, 20, 30, 0.5, 'abc' )
>>> packer.pack_into( buf, off, 'i1', 12 )

Even in sequential access speed benefits, by avoiding the construction
of n-1 objects.

PS: If you don't have time or don't want to consider it seriously, or
want to see more specifics, just say so.
--
http://mail.python.org/mailman/listinfo/python-list


timr at probo

Aug 27, 2008, 11:59 PM

Post #2 of 5 (59 views)
Permalink
Re: struct.Struct random access [In reply to]

castironpi <castironpi[at]gmail.com> wrote:
>
>I'd like to seriously nominate this idea and get a considered opinion
>on it.
>
>struct.Struct lets you encode Python objects into structured memory.
>It accepts a format string, and optionally a buffer and offset to/from
>which to read/write the structure. What do you think of random access
>to the results? To avoid Marc's concern about meaningless anonymous
>record entries, model the constructor after 'namedtuple' type.
>
>(unproduced)
>>>> packer= struct.Struct( 'IIIf255p', 'i1 i2 i3 afloat name' )
>>>> packer.pack_into( buf, off, 10, 20, 30, 0.5, 'abc' )
>>>> packer.unpack_from( buf, off, 'i3' )
>30
>>>> packer.unpack_from( buf, off )
>( 10, 20, 30, 0.5, 'abc' )
>>>> packer.pack_into( buf, off, 'i1', 12 )

What data type would you expect "buf" to be? Your design requires it to be
both an input and an output parameter. Today's "struct" converts into and
out of a string, and strings are immutable. So, to continue with that
standard, you would have to pass a string into "pack_into" and have the
modified result returned as an output:

buf = packer.pack_into( None, 0, 10, 20, 30, 0.5, 'abc' )
buf = packer.pack_into( buf, 0, 'i1', 12 )

In the end, I'm not sure you are really saving anything.

>Even in sequential access speed benefits, by avoiding the construction
>of n-1 objects.

This is a fairly major change, because it requires a "struct.Struct" object
to maintain state, something that the "struct" module currently does not
do.

In my personal opinion, this is a rather large and confusing change, for
very little benefit.
--
Tim Roberts, timr[at]probo.com
Providenza & Boekelheide, Inc.
--
http://mail.python.org/mailman/listinfo/python-list


castironpi at gmail

Aug 28, 2008, 11:40 AM

Post #3 of 5 (53 views)
Permalink
Re: struct.Struct random access [In reply to]

On Aug 28, 1:59 am, Tim Roberts <t...@probo.com> wrote:
> castironpi <castiro...@gmail.com> wrote:
>
> >I'd like to seriously nominate this idea and get a considered opinion
> >on it.
>
> >struct.Struct lets you encode Python objects into structured memory.
> >It accepts a format string, and optionally a buffer and offset to/from
> >which to read/write the structure.  What do you think of random access
> >to the results?  To avoid Marc's concern about meaningless anonymous
> >record entries, model the constructor after 'namedtuple' type.
>
> >(unproduced)
> >>>> packer= struct.Struct( 'IIIf255p', 'i1 i2 i3 afloat name' )
> >>>> packer.pack_into( buf, off, 10, 20, 30, 0.5, 'abc' )
> >>>> packer.unpack_from( buf, off, 'i3' )
> >30
> >>>> packer.unpack_from( buf, off )
> >( 10, 20, 30, 0.5, 'abc' )
> >>>> packer.pack_into( buf, off, 'i1', 12 )
>
> What data type would you expect "buf" to be?  Your design requires it to be
> both an input and an output parameter.  Today's "struct" converts into and
> out of a string, and strings are immutable.  So, to continue with that
> standard, you would have to pass a string into "pack_into" and have the
> modified result returned as an output:
>
>     buf = packer.pack_into( None, 0, 10, 20, 30, 0.5, 'abc' )
>     buf = packer.pack_into( buf, 0, 'i1', 12 )
>
> In the end, I'm not sure you are really saving anything.
>
> >Even in sequential access speed benefits, by avoiding the construction
> >of n-1 objects.
>
> This is a fairly major change, because it requires a "struct.Struct" object
> to maintain state, something that the "struct" module currently does not
> do.
>
> In my personal opinion, this is a rather large and confusing change, for
> very little benefit.
> --
> Tim Roberts, t...@probo.com
> Providenza & Boekelheide, Inc.

CMIIW correct me if I'm wrong, I don't think that pack_into returns a
value the way that pack does.

The syntax is ambiguous in the case of two-element structs: are you
packing a new struct or assigning a field? Maybe the field name needs
a keyword. A field name can be a third argument in unpack_from
regardless, however. Or use the field name as keyword:
strt.pack_into( buf, off, i1= 32 ).

I just tried an experiment with an Mmap and PyObject_AsWriteBuffer.
Mmaps could work but you would not be able to use arbitrary strings.
You would have to specially allocate a ctypes buffer with a size to
match the packed size of the structure.
--
http://mail.python.org/mailman/listinfo/python-list


timr at probo

Aug 29, 2008, 8:30 PM

Post #4 of 5 (49 views)
Permalink
Re: struct.Struct random access [In reply to]

castironpi <castironpi[at]gmail.com> wrote:
>
>CMIIW correct me if I'm wrong, I don't think that pack_into returns a
>value the way that pack does.

Sorry, I was not aware that struct.pack_into and struct.unpack_from already
existed (they were added in Python 2.5). I thought you were proposing them
as new additions.

Because of that, the rest of my post doesn't make much sense.
--
Tim Roberts, timr[at]probo.com
Providenza & Boekelheide, Inc.
--
http://mail.python.org/mailman/listinfo/python-list


castironpi at gmail

Aug 29, 2008, 9:28 PM

Post #5 of 5 (48 views)
Permalink
Re: struct.Struct random access [In reply to]

On Aug 29, 10:30 pm, Tim Roberts <t...@probo.com> wrote:
> castironpi <castiro...@gmail.com> wrote:
>
> >CMIIW correct me if I'm wrong, I don't think that pack_into returns a
> >value the way that pack does.
>
> Sorry, I was not aware that struct.pack_into and struct.unpack_from already
> existed (they were added in Python 2.5).  I thought you were proposing them
> as new additions.
>
> Because of that, the rest of my post doesn't make much sense.
> --
> Tim Roberts, t...@probo.com
> Providenza & Boekelheide, Inc.

I was a lot less enthusiastic too when I discovered
'PyObject_AsWriteBuffer'. Nevertheless I think it could be
instructive as well as a benefit. The ctypes conversion,
cast( buffer_p + offset ), is a bit of a kludge. With the
introduction of 'namedtuple' type, I think it falls right in line with
the direction Python is going in.

It might suffice to merely expose the 'offset' member of the items in
the array of 'formatcode'. Though, the addition of the dictionary to
lookup offsets by field name could offset the benefit somewhat.
--
http://mail.python.org/mailman/listinfo/python-list

Python python RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact lists@gossamer-threads.com
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.