Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Effektiva Strängoperationer | Förbättra Prestanda med Inbyggda Verktyg
Optimeringstekniker i Python

bookEffektiva Strängoperationer

Effektiv strängkonkatenering

Vid arbete med många strängar är det avgörande att använda den mest effektiva metoden för konkatenering. Att använda operatorn + (+=) upprepade gånger är ineffektivt för stora datamängder, eftersom en ny sträng skapas varje gång. Istället är str.join() mycket snabbare och mer minnes­effektivt.

Låt oss jämföra prestandan för två tillvägagångssätt för att konkatenera strängar med radbrytningstecken till en enda sträng. Det första använder en for-loop med operatorn +=, medan det andra utnyttjar den mer effektiva metoden str.join().

1234567891011121314151617181920212223
import os decorators = os.system('wget https://content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator # Simulated lines of a report lines = [f"Line {i}" for i in range(1, 1000001)] # Inefficient concatenation @timeit_decorator(number=50) def concat_with_plus(): result = "" for line in lines: result += line + "\n" return result # Efficient concatenation @timeit_decorator(number=50) def concat_with_join(): return "\n".join(lines) + "\n" # Add final newline for consistency result_plus = concat_with_plus() result_join = concat_with_join() print(result_plus == result_join)
copy

Förkompilering av reguljära uttryck

Vid arbete med reguljära uttryck kan prestanda bli en utmaning, särskilt vid stora datamängder eller upprepade mönstermatchningar. I sådana fall är förkompilering av mönstret en användbar optimeringsteknik.

Förkompilering säkerställer att regexmotorn inte kompilerar om mönstret varje gång det används, vilket kan förbättra prestandan avsevärt när samma mönster tillämpas flera gånger över en datamängd. Detta tillvägagångssätt är särskilt fördelaktigt i scenarier som filtrering, validering eller sökning i stora textfiler.

Låt oss jämföra prestandan mellan två metoder för att validera användarnamn med reguljära uttryck. Den första metoden använder funktionen re.match med mönstret definierat inline varje gång den anropas. Den andra, mer effektiva metoden, förkompilerar regexmönstret med re.compile och återanvänder det för alla valideringar.

1234567891011121314151617181920212223
import os import re decorators = os.system('wget https://content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator # Simulated usernames usernames = ["user123", "admin!@#", "test_user", "invalid!"] * 100000 # Naive approach @timeit_decorator(number=10) def validate_with_re(): pattern = r"^\w+$" return [bool(re.match(pattern, username)) for username in usernames] # Optimized approach @timeit_decorator(number=10) def validate_with_compiled_re(): compiled_pattern = re.compile(r"^\w+$") return [bool(compiled_pattern.match(username)) for username in usernames] result_without_precompiling = validate_with_re() result_with_precompiling = validate_with_compiled_re() print(result_without_precompiling == result_with_precompiling)
copy

1. Du genererar en rapport med 10000 rader, där varje rad representerar en transaktionssammanfattning. Vilken metod är mest effektiv för att kombinera dessa rader till en enda sträng med ; mellan dem?

2. Varför är det ofta snabbare att förkompilera ett reguljärt uttryck med re.compile() än att använda re.match() med ett inbäddat mönster?

question mark

Du genererar en rapport med 10000 rader, där varje rad representerar en transaktionssammanfattning. Vilken metod är mest effektiv för att kombinera dessa rader till en enda sträng med ; mellan dem?

Select the correct answer

question mark

Varför är det ofta snabbare att förkompilera ett reguljärt uttryck med re.compile() än att använda re.match() med ett inbäddat mönster?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 4

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Suggested prompts:

Can you explain why using str.join() is more efficient than using += for string concatenation?

What does the timeit_decorator do in these examples?

Can you provide more details about how precompiling regular expressions improves performance?

Awesome!

Completion rate improved to 7.69

bookEffektiva Strängoperationer

Svep för att visa menyn

Effektiv strängkonkatenering

Vid arbete med många strängar är det avgörande att använda den mest effektiva metoden för konkatenering. Att använda operatorn + (+=) upprepade gånger är ineffektivt för stora datamängder, eftersom en ny sträng skapas varje gång. Istället är str.join() mycket snabbare och mer minnes­effektivt.

Låt oss jämföra prestandan för två tillvägagångssätt för att konkatenera strängar med radbrytningstecken till en enda sträng. Det första använder en for-loop med operatorn +=, medan det andra utnyttjar den mer effektiva metoden str.join().

1234567891011121314151617181920212223
import os decorators = os.system('wget https://content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator # Simulated lines of a report lines = [f"Line {i}" for i in range(1, 1000001)] # Inefficient concatenation @timeit_decorator(number=50) def concat_with_plus(): result = "" for line in lines: result += line + "\n" return result # Efficient concatenation @timeit_decorator(number=50) def concat_with_join(): return "\n".join(lines) + "\n" # Add final newline for consistency result_plus = concat_with_plus() result_join = concat_with_join() print(result_plus == result_join)
copy

Förkompilering av reguljära uttryck

Vid arbete med reguljära uttryck kan prestanda bli en utmaning, särskilt vid stora datamängder eller upprepade mönstermatchningar. I sådana fall är förkompilering av mönstret en användbar optimeringsteknik.

Förkompilering säkerställer att regexmotorn inte kompilerar om mönstret varje gång det används, vilket kan förbättra prestandan avsevärt när samma mönster tillämpas flera gånger över en datamängd. Detta tillvägagångssätt är särskilt fördelaktigt i scenarier som filtrering, validering eller sökning i stora textfiler.

Låt oss jämföra prestandan mellan två metoder för att validera användarnamn med reguljära uttryck. Den första metoden använder funktionen re.match med mönstret definierat inline varje gång den anropas. Den andra, mer effektiva metoden, förkompilerar regexmönstret med re.compile och återanvänder det för alla valideringar.

1234567891011121314151617181920212223
import os import re decorators = os.system('wget https://content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator # Simulated usernames usernames = ["user123", "admin!@#", "test_user", "invalid!"] * 100000 # Naive approach @timeit_decorator(number=10) def validate_with_re(): pattern = r"^\w+$" return [bool(re.match(pattern, username)) for username in usernames] # Optimized approach @timeit_decorator(number=10) def validate_with_compiled_re(): compiled_pattern = re.compile(r"^\w+$") return [bool(compiled_pattern.match(username)) for username in usernames] result_without_precompiling = validate_with_re() result_with_precompiling = validate_with_compiled_re() print(result_without_precompiling == result_with_precompiling)
copy

1. Du genererar en rapport med 10000 rader, där varje rad representerar en transaktionssammanfattning. Vilken metod är mest effektiv för att kombinera dessa rader till en enda sträng med ; mellan dem?

2. Varför är det ofta snabbare att förkompilera ett reguljärt uttryck med re.compile() än att använda re.match() med ett inbäddat mönster?

question mark

Du genererar en rapport med 10000 rader, där varje rad representerar en transaktionssammanfattning. Vilken metod är mest effektiv för att kombinera dessa rader till en enda sträng med ; mellan dem?

Select the correct answer

question mark

Varför är det ofta snabbare att förkompilera ett reguljärt uttryck med re.compile() än att använda re.match() med ett inbäddat mönster?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 4
some-alt