Kaydet (Commit) 3d731c59 authored tarafından Guido van Rossum's avatar Guido van Rossum

Issue #15138: Speed up base64.urlsafe_b64* considerably (2.7 backport).

üst 1edd2f62
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
import re import re
import struct import struct
import string
import binascii import binascii
...@@ -52,7 +53,7 @@ def b64encode(s, altchars=None): ...@@ -52,7 +53,7 @@ def b64encode(s, altchars=None):
# Strip off the trailing newline # Strip off the trailing newline
encoded = binascii.b2a_base64(s)[:-1] encoded = binascii.b2a_base64(s)[:-1]
if altchars is not None: if altchars is not None:
return _translate(encoded, {'+': altchars[0], '/': altchars[1]}) return encoded.translate(string.maketrans(b'+/', altchars[:2]))
return encoded return encoded
...@@ -68,7 +69,7 @@ def b64decode(s, altchars=None): ...@@ -68,7 +69,7 @@ def b64decode(s, altchars=None):
string. string.
""" """
if altchars is not None: if altchars is not None:
s = _translate(s, {altchars[0]: '+', altchars[1]: '/'}) s = s.translate(string.maketrans(altchars[:2], '+/'))
try: try:
return binascii.a2b_base64(s) return binascii.a2b_base64(s)
except binascii.Error, msg: except binascii.Error, msg:
...@@ -92,13 +93,16 @@ def standard_b64decode(s): ...@@ -92,13 +93,16 @@ def standard_b64decode(s):
""" """
return b64decode(s) return b64decode(s)
_urlsafe_encode_translation = string.maketrans(b'+/', b'-_')
_urlsafe_decode_translation = string.maketrans(b'-_', b'+/')
def urlsafe_b64encode(s): def urlsafe_b64encode(s):
"""Encode a string using a url-safe Base64 alphabet. """Encode a string using a url-safe Base64 alphabet.
s is the string to encode. The encoded string is returned. The alphabet s is the string to encode. The encoded string is returned. The alphabet
uses '-' instead of '+' and '_' instead of '/'. uses '-' instead of '+' and '_' instead of '/'.
""" """
return b64encode(s, '-_') return b64encode(s).translate(_urlsafe_encode_translation)
def urlsafe_b64decode(s): def urlsafe_b64decode(s):
"""Decode a string encoded with the standard Base64 alphabet. """Decode a string encoded with the standard Base64 alphabet.
...@@ -109,7 +113,7 @@ def urlsafe_b64decode(s): ...@@ -109,7 +113,7 @@ def urlsafe_b64decode(s):
The alphabet uses '-' instead of '+' and '_' instead of '/'. The alphabet uses '-' instead of '+' and '_' instead of '/'.
""" """
return b64decode(s, '-_') return b64decode(s.translate(_urlsafe_decode_translation))
...@@ -200,7 +204,7 @@ def b32decode(s, casefold=False, map01=None): ...@@ -200,7 +204,7 @@ def b32decode(s, casefold=False, map01=None):
# False, or the character to map the digit 1 (one) to. It should be # False, or the character to map the digit 1 (one) to. It should be
# either L (el) or I (eye). # either L (el) or I (eye).
if map01: if map01:
s = _translate(s, {'0': 'O', '1': map01}) s = s.translate(string.maketrans(b'01', b'O' + map01))
if casefold: if casefold:
s = s.upper() s = s.upper()
# Strip off pad characters from the right. We need to count the pad # Strip off pad characters from the right. We need to count the pad
......
...@@ -34,6 +34,8 @@ Core and Builtins ...@@ -34,6 +34,8 @@ Core and Builtins
Library Library
------- -------
- Issue #15138: Speed up base64.urlsafe_b64{en,de}code considerably.
- Issue #23319: Fix ctypes.BigEndianStructure, swap correctly bytes. Patch - Issue #23319: Fix ctypes.BigEndianStructure, swap correctly bytes. Patch
written by Matthieu Gautier. written by Matthieu Gautier.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment