Skip to content

Commit 03a0536

Browse files
committed
Speed up ProhibitSurrogateCharactersValidator
I've noticed that this validator is using a per-character loop. Replacing it with a regex results in a pretty significant speedup. Here are results from my benchmark: String length Old implementation New implementation time (sec) time (sec) 1 2.833e-07 1.765e-07 10 5.885e-07 2.030e-07 100 3.598e-06 4.144e-07 1000 3.329e-05 2.463e-06 10000 0.0003338 2.449e-05 100000 0.003338 0.0002284 1000000 0.03333 0.002278 10000000 0.3389 0.02377 100000000 3.250 0.2365 For large strings, the speedups are more than an order of magnitude.
1 parent f113ab6 commit 03a0536

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

rest_framework/validators.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
object creation, and makes it possible to switch between using the implicit
77
`ModelSerializer` class and an equivalent explicit `Serializer` class.
88
"""
9+
import re
10+
911
from django.db import DataError
1012
from django.utils.translation import gettext_lazy as _
1113

@@ -197,13 +199,14 @@ def __eq__(self, other):
197199

198200

199201
class ProhibitSurrogateCharactersValidator:
202+
_regex = re.compile(r'[\ud800-\udfff]')
203+
200204
message = _('Surrogate characters are not allowed: U+{code_point:X}.')
201205
code = 'surrogate_characters_not_allowed'
202206

203207
def __call__(self, value):
204-
for surrogate_character in (ch for ch in str(value)
205-
if 0xD800 <= ord(ch) <= 0xDFFF):
206-
message = self.message.format(code_point=ord(surrogate_character))
208+
if match := self._regex.search(str(value)):
209+
message = self.message.format(code_point=ord(match.group()))
207210
raise ValidationError(message, code=self.code)
208211

209212
def __eq__(self, other):

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy