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 | |
| 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')
| -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( |
