diff options
| author | Matthew Somerville | 2010-01-29 14:34:56 +0000 | 
|---|---|---|
| committer | Ben Firshman | 2014-09-21 17:08:55 -0700 | 
| commit | ab5312e7c035e76521140382b47113bcf50acbcf (patch) | |
| tree | f184d0ff8da4d2644ae4faed3bddcb9e5790b596 /src/shorturls | |
| parent | 7cdf9acbb64dd17518c2708916295f7602847ed9 (diff) | |
| download | django-shorturls-ab5312e7c035e76521140382b47113bcf50acbcf.tar.bz2 | |
Speed up from_decimal and to_decimal by a lot (third to 50%ish).
Diffstat (limited to 'src/shorturls')
| -rw-r--r-- | src/shorturls/baseconv.py | 52 | 
1 files changed, 24 insertions, 28 deletions
| diff --git a/src/shorturls/baseconv.py b/src/shorturls/baseconv.py index 0e62b83..1b4fd15 100644 --- a/src/shorturls/baseconv.py +++ b/src/shorturls/baseconv.py @@ -13,14 +13,25 @@ Sample usage:  """  class BaseConverter(object): -    decimal_digits = "0123456789"      decode_mapping = {}      def __init__(self, digits):          self.digits = digits +        self.length = len(digits)      def from_decimal(self, i): -        return self.convert(i, self.decimal_digits, self.digits) +        if i < 0: +            i, neg = -i, 1 +        else: +            neg = 0 +        enc = '' +        while i >= self.length: +            i, mod = divmod(i, self.length) +            enc = self.digits[mod] + enc +        enc = self.digits[i] + enc +        if neg: +            enc = '-' + enc +        return enc      def to_decimal(self, s):          if self.decode_mapping: @@ -31,35 +42,20 @@ class BaseConverter(object):                  else:                      new += digit              s = new -        return int(self.convert(s, self.digits, self.decimal_digits)) -     -    def convert(number, fromdigits, todigits): -        # Based on http://code.activestate.com/recipes/111286/ -        if str(number)[0] == '-': -            number = str(number)[1:] -            neg = 1 +        if str(s)[0] == '-': +            s, neg = str(s)[1:], 1          else:              neg = 0 - -        # make an integer out of the number -        x = 0 -        for digit in str(number): -           x = x * len(fromdigits) + fromdigits.index(digit) +        decoded = 0 +        multi = 1 +        while len(s) > 0: +            decoded += multi * self.digits.index(s[-1:]) +            multi = multi * self.length +            s = s[:-1] +        if neg: +            decoded = -decoded +        return decoded -        # create the result in base 'len(todigits)' -        if x == 0: -            res = todigits[0] -        else: -            res = "" -            while x > 0: -                digit = x % len(todigits) -                res = todigits[digit] + res -                x = int(x / len(todigits)) -            if neg: -                res = '-' + res -        return res -    convert = staticmethod(convert) -  bin = BaseConverter('01')  hexconv = BaseConverter('0123456789ABCDEF')  base62 = BaseConverter( | 
