mirror of https://github.com/astral-sh/ruff
Slight speed-up for lowercase and uppercase identifier checks (#9798)
It turns out that for ASCII identifiers, this is nearly 2x faster: ``` Parser/before time: [15.388 ns 15.395 ns 15.406 ns] Parser/after time: [8.3786 ns 8.5821 ns 8.7715 ns] ```
This commit is contained in:
parent
e0a6034cbb
commit
2352de2277
|
|
@ -14,9 +14,25 @@
|
||||||
/// assert!(!is_lowercase("ABC"));
|
/// assert!(!is_lowercase("ABC"));
|
||||||
/// assert!(is_lowercase(""));
|
/// assert!(is_lowercase(""));
|
||||||
/// assert!(is_lowercase("_"));
|
/// assert!(is_lowercase("_"));
|
||||||
|
/// assert!(is_lowercase("αbc"));
|
||||||
|
/// assert!(!is_lowercase("αBC"));
|
||||||
|
/// assert!(!is_lowercase("Ωbc"));
|
||||||
/// ```
|
/// ```
|
||||||
pub fn is_lowercase(s: &str) -> bool {
|
pub fn is_lowercase(s: &str) -> bool {
|
||||||
s.chars().all(|c| !c.is_alphabetic() || c.is_lowercase())
|
for (i, &c) in s.as_bytes().iter().enumerate() {
|
||||||
|
match c {
|
||||||
|
// Match against ASCII uppercase characters.
|
||||||
|
b'A'..=b'Z' => return false,
|
||||||
|
_ if c.is_ascii() => {}
|
||||||
|
// If the character is non-ASCII, fallback to slow path.
|
||||||
|
_ => {
|
||||||
|
return s[i..]
|
||||||
|
.chars()
|
||||||
|
.all(|c| c.is_lowercase() || !c.is_alphabetic())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return `true` if a string is uppercase.
|
/// Return `true` if a string is uppercase.
|
||||||
|
|
@ -35,9 +51,25 @@ pub fn is_lowercase(s: &str) -> bool {
|
||||||
/// assert!(!is_uppercase("abc"));
|
/// assert!(!is_uppercase("abc"));
|
||||||
/// assert!(is_uppercase(""));
|
/// assert!(is_uppercase(""));
|
||||||
/// assert!(is_uppercase("_"));
|
/// assert!(is_uppercase("_"));
|
||||||
|
/// assert!(is_uppercase("ΩBC"));
|
||||||
|
/// assert!(!is_uppercase("Ωbc"));
|
||||||
|
/// assert!(!is_uppercase("αBC"));
|
||||||
/// ```
|
/// ```
|
||||||
pub fn is_uppercase(s: &str) -> bool {
|
pub fn is_uppercase(s: &str) -> bool {
|
||||||
s.chars().all(|c| !c.is_alphabetic() || c.is_uppercase())
|
for (i, &c) in s.as_bytes().iter().enumerate() {
|
||||||
|
match c {
|
||||||
|
// Match against ASCII lowercase characters.
|
||||||
|
b'a'..=b'z' => return false,
|
||||||
|
_ if c.is_ascii() => {}
|
||||||
|
// If the character is non-ASCII, fallback to slow path.
|
||||||
|
_ => {
|
||||||
|
return s[i..]
|
||||||
|
.chars()
|
||||||
|
.all(|c| c.is_uppercase() || !c.is_alphabetic())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return `true` if a string is _cased_ as lowercase.
|
/// Return `true` if a string is _cased_ as lowercase.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue