Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Effektive Strengoperasjoner | Forbedre Ytelsen med Innebygde Verktøy
Optimaliseringsteknikker i Python

bookEffektive Strengoperasjoner

Effektiv strengsammenkobling

Ved arbeid med mange strenger er det viktig å bruke den mest effektive metoden for sammenkobling. Å bruke + (+=) operatoren gjentatte ganger er ineffektivt for store datasett, siden det opprettes en ny streng hver gang. I stedet er bruk av str.join() mye raskere og mer minneeffektivt.

La oss sammenligne ytelsen til to tilnærminger for å sammenkoble strenger med linjeskifttegn til én enkelt streng. Den første bruker en for-løkke med +=-operatoren, mens den andre benytter den mer effektive str.join()-metoden.

1234567891011121314151617181920212223
import os decorators = os.system('wget https://staging-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

Forhåndskompilering av regulære uttrykk

Ved arbeid med regulære uttrykk kan ytelsen bli en utfordring, spesielt ved store datasett eller gjentatt mønstergjenkjenning. I slike tilfeller er forhåndskompilering av mønsteret en nyttig optimaliseringsteknikk.

Forhåndskompilering sikrer at regex-motoren ikke kompilere mønsteret på nytt hver gang det brukes, noe som kan forbedre ytelsen betydelig når det samme mønsteret brukes flere ganger over et datasett. Denne tilnærmingen er spesielt fordelaktig i scenarier som filtrering, validering eller søk i store tekstfiler.

La oss sammenligne ytelsen til to tilnærminger for å validere brukernavn ved hjelp av regulære uttrykk. Den første tilnærmingen bruker funksjonen re.match med mønsteret definert direkte hver gang den kalles. Den andre, mer effektive tilnærmingen, forhåndskompilerer regex-mønsteret ved å bruke re.compile og gjenbruker det for alle valideringer.

1234567891011121314151617181920212223
import os import re decorators = os.system('wget https://staging-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 genererer en rapport med 10000 linjer, der hver linje representerer et transaksjonssammendrag. Hvilken metode er mest effektiv for å kombinere disse linjene til én streng med ; mellom dem?

2. Hvorfor er det ofte raskere å prekompilere et regulært uttrykk med re.compile() enn å bruke re.match() med et mønster direkte?

question mark

Du genererer en rapport med 10000 linjer, der hver linje representerer et transaksjonssammendrag. Hvilken metode er mest effektiv for å kombinere disse linjene til én streng med ; mellom dem?

Select the correct answer

question mark

Hvorfor er det ofte raskere å prekompilere et regulært uttrykk med re.compile() enn å bruke re.match() med et mønster direkte?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 4

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

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

bookEffektive Strengoperasjoner

Sveip for å vise menyen

Effektiv strengsammenkobling

Ved arbeid med mange strenger er det viktig å bruke den mest effektive metoden for sammenkobling. Å bruke + (+=) operatoren gjentatte ganger er ineffektivt for store datasett, siden det opprettes en ny streng hver gang. I stedet er bruk av str.join() mye raskere og mer minneeffektivt.

La oss sammenligne ytelsen til to tilnærminger for å sammenkoble strenger med linjeskifttegn til én enkelt streng. Den første bruker en for-løkke med +=-operatoren, mens den andre benytter den mer effektive str.join()-metoden.

1234567891011121314151617181920212223
import os decorators = os.system('wget https://staging-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

Forhåndskompilering av regulære uttrykk

Ved arbeid med regulære uttrykk kan ytelsen bli en utfordring, spesielt ved store datasett eller gjentatt mønstergjenkjenning. I slike tilfeller er forhåndskompilering av mønsteret en nyttig optimaliseringsteknikk.

Forhåndskompilering sikrer at regex-motoren ikke kompilere mønsteret på nytt hver gang det brukes, noe som kan forbedre ytelsen betydelig når det samme mønsteret brukes flere ganger over et datasett. Denne tilnærmingen er spesielt fordelaktig i scenarier som filtrering, validering eller søk i store tekstfiler.

La oss sammenligne ytelsen til to tilnærminger for å validere brukernavn ved hjelp av regulære uttrykk. Den første tilnærmingen bruker funksjonen re.match med mønsteret definert direkte hver gang den kalles. Den andre, mer effektive tilnærmingen, forhåndskompilerer regex-mønsteret ved å bruke re.compile og gjenbruker det for alle valideringer.

1234567891011121314151617181920212223
import os import re decorators = os.system('wget https://staging-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 genererer en rapport med 10000 linjer, der hver linje representerer et transaksjonssammendrag. Hvilken metode er mest effektiv for å kombinere disse linjene til én streng med ; mellom dem?

2. Hvorfor er det ofte raskere å prekompilere et regulært uttrykk med re.compile() enn å bruke re.match() med et mønster direkte?

question mark

Du genererer en rapport med 10000 linjer, der hver linje representerer et transaksjonssammendrag. Hvilken metode er mest effektiv for å kombinere disse linjene til én streng med ; mellom dem?

Select the correct answer

question mark

Hvorfor er det ofte raskere å prekompilere et regulært uttrykk med re.compile() enn å bruke re.match() med et mønster direkte?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 4
some-alt