Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit c004e49

Browse filesBrowse files
committed
Micro-optimize _to_rgba_no_colorcycle.
This patch speeds up conversions of `#rgba`-type formats by between 25% and 40% (while shortening the implementation), although real benefits should be limited because of caching in to_rgba.
1 parent 2f6589d commit c004e49
Copy full SHA for c004e49

File tree

Expand file treeCollapse file tree

1 file changed

+20
-29
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+20
-29
lines changed

‎lib/matplotlib/colors.py

Copy file name to clipboardExpand all lines: lib/matplotlib/colors.py
+20-29Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -372,40 +372,31 @@ def _to_rgba_no_colorcycle(c, alpha=None):
372372
# This may turn c into a non-string, so we check again below.
373373
c = _colors_full_map[c]
374374
except KeyError:
375-
if len(orig_c) != 1:
375+
if len(c) != 1:
376376
try:
377377
c = _colors_full_map[c.lower()]
378378
except KeyError:
379379
pass
380380
if isinstance(c, str):
381-
# hex color in #rrggbb format.
382-
match = re.match(r"\A#[a-fA-F0-9]{6}\Z", c)
383-
if match:
384-
return (tuple(int(n, 16) / 255
385-
for n in [c[1:3], c[3:5], c[5:7]])
386-
+ (alpha if alpha is not None else 1.,))
387-
# hex color in #rgb format, shorthand for #rrggbb.
388-
match = re.match(r"\A#[a-fA-F0-9]{3}\Z", c)
389-
if match:
390-
return (tuple(int(n, 16) / 255
391-
for n in [c[1]*2, c[2]*2, c[3]*2])
392-
+ (alpha if alpha is not None else 1.,))
393-
# hex color with alpha in #rrggbbaa format.
394-
match = re.match(r"\A#[a-fA-F0-9]{8}\Z", c)
395-
if match:
396-
color = [int(n, 16) / 255
397-
for n in [c[1:3], c[3:5], c[5:7], c[7:9]]]
398-
if alpha is not None:
399-
color[-1] = alpha
400-
return tuple(color)
401-
# hex color with alpha in #rgba format, shorthand for #rrggbbaa.
402-
match = re.match(r"\A#[a-fA-F0-9]{4}\Z", c)
403-
if match:
404-
color = [int(n, 16) / 255
405-
for n in [c[1]*2, c[2]*2, c[3]*2, c[4]*2]]
406-
if alpha is not None:
407-
color[-1] = alpha
408-
return tuple(color)
381+
if re.fullmatch("#[a-fA-F0-9]+", c):
382+
if len(c) == 7: # #rrggbb hex format.
383+
return (*[n / 0xff for n in bytes.fromhex(c[1:])],
384+
alpha if alpha is not None else 1.)
385+
elif len(c) == 4: # #rgb hex format, shorthand for #rrggbb.
386+
return (*[int(n, 16) / 0xf for n in c[1:]],
387+
alpha if alpha is not None else 1.)
388+
elif len(c) == 9: # #rrggbbaa hex format.
389+
color = [n / 0xff for n in bytes.fromhex(c[1:])]
390+
if alpha is not None:
391+
color[-1] = alpha
392+
return tuple(color)
393+
elif len(c) == 5: # #rgba hex format, shorthand for #rrggbbaa.
394+
color = [int(n, 16) / 0xf for n in c[1:]]
395+
if alpha is not None:
396+
color[-1] = alpha
397+
return tuple(color)
398+
else:
399+
raise ValueError(f"Invalid hex color specifier: {orig_c!r}")
409400
# string gray.
410401
try:
411402
c = float(c)

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.