[pypy-dev] Optimizing Append Only structures

Romain Guillebert romain.py at gmail.com
Tue Nov 29 21:28:44 CET 2011


Probably because he (as a clojure developer) likes immutability of data
structures.

On Tue, Nov 29, 2011 at 9:15 PM, Maciej Fijalkowski <fijall at gmail.com>wrote:

> On Tue, Nov 29, 2011 at 10:12 PM, Alex Gaynor <alex.gaynor at gmail.com>
> wrote:
> >
> >
> > On Tue, Nov 29, 2011 at 3:04 PM, Timothy Baldridge <tbaldridge at gmail.com
> >
> > wrote:
> >>
> >> I have a dictionary (in RPython) that looks something like this:
> >>
> >>
> >> class MyDict(Obj):
> >>    def add(self, k, v):
> >>         newdict = self.dict.copy()
> >>         newdict[k] = v
> >>         self.dict = newdict
> >>    def get(self, k):
> >>        d = self.dict
> >>        return MyDict._static_get(d, k)
> >>   @staticmethod
> >>   @purefunction
> >>   def _static_get(d, k):
> >>        if d not in k:
> >>            return None
> >>        return d[k]
> >>
> >>
> >> I'm trying to figure out the best way to optimize this. As you see,
> >> this structure is "append only". That is if mydict.get("foo") returns
> >> a value it will always return that value, for all time. In that sense,
> >> the function is pure. If however, the function returns None, then it
> >> could change in the future.
> >>
> >> This is for my Clojure on PyPy implementation. The idea is that types
> >> can be extended via protocols, at runtime, at any point in the
> >> program's execution. However, once a given type is extended to support
> >> a given interface (or protocol) it will never be able to be changed.
> >> That is, once we extend Foo so that it implements Foo.count() it will
> >> implement Foo.count() for all time.
> >>
> >> Any thoughts on how to optimize this further for the jit? I'd like to
> >> promote the value of get() to a constant, but I can only do that as
> >> long as it is not None. After Foo is extended, I'd like the jit to
> >> re-generate the jitted code to remove all guards, hopefully saving a
> >> few cycles.
> >>
> >> Timothy
> >>
> >>
> >> --
> >> “One of the main causes of the fall of the Roman Empire was
> >> that–lacking zero–they had no way to indicate successful termination
> >> of their C programs.”
> >> (Robert Firth)
> >> _______________________________________________
> >> pypy-dev mailing list
> >> pypy-dev at python.org
> >> http://mail.python.org/mailman/listinfo/pypy-dev
> >
> >
> > Sounds like the idea you're looking for is basically out-of-line guards.
> >  Basically the idea of these is you have  field which rarely changes, and
> > when it does you should regenerate all code.  So you would have an object
> > with the dict and a signature, and you could mutate the dict, but
> whenever
> > you did, you'd need to update the signature.  PyPy's module-dictionary
> > implementation shows an example of
> > this:
> https://bitbucket.org/pypy/pypy/src/default/pypy/objspace/std/celldict.py
> >
> > Alex
> >
> > --
> > "I disapprove of what you say, but I will defend to the death your right
> to
> > say it." -- Evelyn Beatrice Hall (summarizing Voltaire)
> > "The people's good is the highest law." -- Cicero
> >
> >
> > _______________________________________________
> > pypy-dev mailing list
> > pypy-dev at python.org
> > http://mail.python.org/mailman/listinfo/pypy-dev
> >
>
> Why do you always make a copy of a dict btw?
> _______________________________________________
> pypy-dev mailing list
> pypy-dev at python.org
> http://mail.python.org/mailman/listinfo/pypy-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pypy-dev/attachments/20111129/50f6290a/attachment.html>


More information about the pypy-dev mailing list