Python のシンプルさにより、開発者は関数型プログラムを迅速に作成できますが、高度なテクニックを使用すると、コードをさらに効率的で保守しやすく、エレガントにすることができます。これらの高度なヒントと例は、Python スキルを次のレベルに引き上げます。
大規模なデータセットを扱う場合は、リストの代わりにジェネレーターを使用してメモリを節約します。
# List consumes memory upfront numbers = [i**2 for i in range(1_000_000)] # Generator evaluates lazily numbers = (i**2 for i in range(1_000_000)) # Iterate over the generator for num in numbers: print(num) # Processes one item at a time
理由: ジェネレーターはオンザフライで項目を作成するため、シーケンス全体をメモリに保存する必要がなくなります。
主にデータを保存するクラスの場合、データクラスによって定型コードが削減されます。
from dataclasses import dataclass @dataclass class Employee: name: str age: int position: str # Instead of defining __init__, __repr__, etc. emp = Employee(name="Alice", age=30, position="Engineer") print(emp) # Employee(name='Alice', age=30, position='Engineer')
理由: データクラスは __init__ 、 __repr__ 、およびその他のメソッドを自動的に処理します。
カスタム コンテキスト マネージャーによりリソース管理が簡素化されます:
from contextlib import contextmanager @contextmanager def open_file(file_name, mode): file = open(file_name, mode) try: yield file finally: file.close() # Usage with open_file("example.txt", "w") as f: f.write("Hello, world!")
理由: 例外が発生した場合でも、コンテキスト マネージャーは適切なクリーンアップ (ファイルを閉じるなど) を保証します。
4.関数アノテーションを活用する
注釈により明確さが向上し、静的分析が可能になります:
def calculate_area(length: float, width: float) -> float: return length * width # IDEs and tools like MyPy can validate these annotations area = calculate_area(5.0, 3.2)
理由: 注釈によりコードが自己文書化され、開発中の型エラーの検出に役立ちます。
デコレーターは、元の関数を変更せずに機能を拡張または変更します。
def log_execution(func): def wrapper(*args, **kwargs): print(f"Executing {func.__name__} with {args}, {kwargs}") return func(*args, **kwargs) return wrapper @log_execution def add(a, b): return a + b result = add(3, 5) # Output: Executing add with (3, 5), {}
理由: デコレーターは、ロギング、認証、タイミング関数などのタスクの重複を減らします。
functools モジュールは、複雑な関数の動作を簡素化します。
from functools import lru_cache @lru_cache(maxsize=100) def fibonacci(n): if n < 2: return n return fibonacci(n - 1) + fibonacci(n - 2) print(fibonacci(50)) # Efficient due to caching
理由: lru_cache のような関数は、負荷の高い関数呼び出しの結果をメモ化することでパフォーマンスを最適化します。
コレクション モジュールは高度なデータ構造を提供します。
from collections import defaultdict, Counter # defaultdict with default value word_count = defaultdict(int) for word in ["apple", "banana", "apple"]: word_count[word] += 1 print(word_count) # {'apple': 2, 'banana': 1} # Counter for frequency counting freq = Counter(["apple", "banana", "apple"]) print(freq.most_common(1)) # [('apple', 2)]
理由:defaultdict と Counter は、出現数のカウントなどのタスクを簡素化します。
CPU バウンドまたは IO バウンドのタスクの場合、並列実行により処理が高速化されます。
from concurrent.futures import ThreadPoolExecutor def square(n): return n * n with ThreadPoolExecutor(max_workers=4) as executor: results = executor.map(square, range(10)) print(list(results)) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
理由: concurrent.futures により、マルチスレッドとマルチ処理が容易になります。
9.ファイル操作には pathlib を使用します
pathlib モジュールは、ファイル パスを操作するための直感的かつ強力な方法を提供します。
from pathlib import Path path = Path("example.txt") # Write to a file path.write_text("Hello, pathlib!") # Read from a file content = path.read_text() print(content) # Check if a file exists if path.exists(): print("File exists")
理由: pathlib は、os や os.path と比べて読みやすく、多用途です。
依存関係をモックして複雑なシステムをテストする:
# List consumes memory upfront numbers = [i**2 for i in range(1_000_000)] # Generator evaluates lazily numbers = (i**2 for i in range(1_000_000)) # Iterate over the generator for num in numbers: print(num) # Processes one item at a time
理由: モックはテスト対象のコードを分離し、外部の依存関係がテストに干渉しないようにします。
これらの高度なテクニックをマスターすると、Python コーディング スキルが向上します。これらをワークフローに組み込んで、機能的であるだけでなく、効率的で保守しやすい Python 的なコードを作成します。コーディングを楽しんでください!
以上がPython コードを改善するための高度なヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。