[python-uk] A stack with better performance than using a list
Simon Hayward
simon at fastmail.to
Thu Jun 8 04:30:50 EDT 2017
Rather than using a list, aren't deques more appropriate as a data
structure for stack like behaviour.
https://docs.python.org/3.6/library/collections.html#collections.deque
Regards
Simon
On Wed, 7 Jun 2017, at 19:33, Jonathan Hartley wrote:
> Hey.
>
> Thanks for engaging, but I can't help with the most important of those
> questions - the large data sets on which my solution failed due to
> timeout are hidden from candidates. Not unreasonable to assume that they
> do exercise deep stacks, and large args to add_to_first_n, etc.
>
> Yes, the input looks exactly like your example. All args are integers.
> The question asked for output corresponding to the top of the stack
> after every operation. I omitted this print from inside the 'for' loop
> in 'main', thinking it irrelevant.
>
> I converted to integers inside 'dispatch'. 'args' must have actually
> been created with:
>
> args = [int(i) for i in tokens[1:]]
>
> Where len(tokens) is never going to be bigger than 3.
>
> Return values (from 'pop') were unused.
>
>
> On 6/7/2017 13:25, Stestagg wrote:
> > Do you have any more context?
> > For example, is the add_to_first_n likely to be called with very large
> > numbers, or very often? Does the stack get very deep, or stay shallow?
> >
> > I'm assuming that lines look like this:
> >
> > push 1
> > push 2
> > add_to_first_n 2 10
> > pop
> > pop
> >
> > with all arguments as integers, and the final value being returned
> > from main()?
> > How did you convert from string inputs to numeric values?
> > How did you manage return values?
> >
> > :D
> >
> > On Wed, Jun 7, 2017 at 6:51 PM Jonathan Hartley <tartley at tartley.com
> > <mailto:tartley at tartley.com>> wrote:
> >
> > I recently submitted a solution to a coding challenge, in an
> > employment context. One of the questions was to model a simple
> > stack. I wrote a solution which appended and popped from the end
> > of a list. This worked, but failed with timeouts on their last few
> > automated tests with large (hidden) data sets.
> >
> > From memory, I think I had something pretty standard:
> >
> > class Stack:
> >
> > def __init__(self):
> > self.storage = []
> >
> > def push(arg):
> > self.storage.append(arg)
> >
> > def pop():
> > return self.storage.pop() if self.storage else None
> >
> > def add_to_first_n(n, amount):
> > for n in range(n):
> > self.storage[n] += amount
> >
> > def dispatch(self, line)
> > tokens = line.split()
> > method = getattr(self, tokens[0])
> > args = tokens[1:]
> > method(*args)
> >
> > def main(lines):
> > stack = Stack()
> > for line in lines:
> > stack.dispatch(line)
> >
> >
> > (will that formatting survive? Apologies if not)
> >
> > Subsequent experiments have confirmed that appending to and
> > popping from the end of lists are O(1), amortized.
> >
> > So why is my solution too slow?
> >
> > This question was against the clock, 4th question of 4 in an hour.
> > So I wasn't expecting to produce Cython or C optimised code in
> > that timeframe (Besides, my submitted .py file runs on their
> > servers, so the environment is limited.)
> >
> > So what am I missing, from a performance perspective? Are there
> > other data structures in stdlib which are also O(1) but with a
> > better constant?
> >
> > Ah. In writing this out, I have begun to suspect that my slicing
> > of 'tokens' to produce 'args' in the dispatch is needlessly
> > wasting time. Not much, but some.
> >
> > Thoughts welcome,
> >
> > Jonathan
> >
> > --
> > Jonathan Hartleytartley at tartley.com <mailto:tartley at tartley.com> http://tartley.com
> > Made out of meat.+1 507-513-1101 <tel:%28507%29%20513-1101> twitter/skype: tartley
> >
> > _______________________________________________
> > python-uk mailing list
> > python-uk at python.org <mailto:python-uk at python.org>
> > https://mail.python.org/mailman/listinfo/python-uk
> >
> >
> >
> > _______________________________________________
> > python-uk mailing list
> > python-uk at python.org
> > https://mail.python.org/mailman/listinfo/python-uk
>
> --
> Jonathan Hartley tartley at tartley.com http://tartley.com
> Made out of meat. +1 507-513-1101 twitter/skype: tartley
>
> _______________________________________________
> python-uk mailing list
> python-uk at python.org
> https://mail.python.org/mailman/listinfo/python-uk
--
Simon
simon at fastmail.to
More information about the python-uk
mailing list