1. GILがマルチスレッドに与える影響
CPythonにはGlobal Interpreter Lock(GIL)が存在し、1プロセス内で1スレッドしかバイトコードを実行できません。これにより複数CPUを活かした並列実行ができません。
さらに、GILはスレッドの実行区間ごとに手放されるため、単純にGILがあればデータ競合が起きないわけではありません。明示的な排他制御が必要です。
2. 同期・非同期・ブロッキング・ノンブロッキングの違い
- 同期(Synchronous):IO処理が完了するまで呼び出し元が待機
- 非同期(Asynchronous):IO処理の完了を待たずに呼び出し元に制御が戻る
- ブロッキング(Blocking):関数呼び出しでスレッドがスリープ
- ノンブロッキング(Non-blocking):関数呼び出しで即座に結果(またはEAGAIN)が返る
3. コルーチンとは
コルーチンは関数の実行を途中で一時停止し、後から再開できる仕組みです。async defやyieldを使って実装し、単一スレッド内で協調的マルチタスクを実現します。
4. コルーチン版フィボナッチジェネレータ
def fibonacci(limit):
a, b = 0, 1
for _ in range(limit):
yield a
a, b = b, a + b
gen = fibonacci(7)
print([num for num in gen]) # [0, 1, 1, 2, 3, 5, 8]
5. デコレータの役割
既存関数のコードを変更せずに、前後処理を注入できる構文糖です。認証、ロギング、キャッシュなど横断的関心事を簡潔に実装できます。
6. 呼び出し回数カウンタ付きデコレータ
from functools import wraps
def call_counter(fn):
count = 0
@wraps(fn)
def wrapper(*args, **kwargs):
nonlocal count
count += 1
print(f'{fn.__name__} が {count} 回呼ばれました')
return fn(*args, **kwargs)
return wrapper
@call_counter
def greet():
print('Hello')
greet()
greet()
7. __new__でシングルトンを実装
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
s1 = Singleton()
s2 = Singleton()
assert s1 is s2
8. Djangoリクエストフロー
- クライアント → Nginx(リバースプロキシ)
- uWSGI → WSGIリクエストオブジェクト生成
- Djangoミドルウェアスタック
- URLconf → ビュー → ビジネスロジック(認証・権限・スロットリング)
- レスポンスオブジェクト → ミドルウェア → uWSGI → Nginx → クライアント
9. TCP vs UDP
| 項目 | TCP | UDP |
|---|---|---|
| 接続 | 3ウェイハンドシェイク | コネクションレス |
| 信頼性 | 再送制御・順序保証 | ベストエフォート |
| 速度 | 遅い | 高速 |
10. 3ウェイハンドシェイク
- クライアント SYN=1, seq=x
- サーバ SYN=1, ACK=1, seq=y, ack=x+1
- クライアント ACK=1, seq=x+1, ack=y+1
11. OSI 7階層モデル
物理 → データリンク → ネットワーク → トランスポート → セッション → プレゼンテーション → アプリケーション
12. map / filter / reduce
from functools import reduce
nums = [1, 2, 3, 4]
squared = list(map(lambda x: x ** 2, nums)) # [1, 4, 9, 16]
evens = list(filter(lambda x: x % 2 == 0, nums)) # [2, 4]
total = reduce(lambda acc, x: acc + x, nums, 0) # 10
13. 正規表現の貪欲・非貪欲とIPv4マッチ
import re
ip = '192.168.0.1'
m = re.fullmatch(r'(?:\d{1,3}\.){3}\d{1,3}', ip)
貪欲マッチは最長一致、非貪欲は最短一致(*? +?)。
14. Linuxコマンド早見表
- 権限確認:
ls -l - 権限変更:
chmod 644 file - メモリ:
free -h/top - プロセス:
ps aux/htop
15. RESTful API
HTTPメソッド(GET/POST/PUT/DELETE)でリソースを操作し、ステートレス・統一インターフェースを提供する設計指針。
16. CSRF攻撃
悪意あるサイトがユーザの認証済みセッションを利用して偽リクエストを送信する攻撃。DjangoではCSRFトークンで対策。
17. *args / **kwargs
def example(*args, **kwargs):
print(args) # タプル
print(kwargs) # 辞書
example(1, 2, x=3, y=4)
18. Djangoミドルウェア
リクエスト/レスポンスフックを提供し、認証・ロギング・CORS・GZipなど横断的処理を実装可能。
19. オブジェクト指向3セプト
- カプセル化:データとメソッドを隠蔽
- 継承:基底クラスを再利用
- ポリモーフィズム:同一インターフェースで異なる動作
20. メソッドデコレータ比較
@classmethod:クラスオブジェクトを第一引数に@staticmethod:インスタンス/クラス参照なし@property:属性アクセスをメソッド化
21. __new__ vs __init__
__new__はインスタンス生成、__init__は初期化。
22. イテレータとイテラブル
from collections.abc import Iterator, Iterable
isinstance([1, 2], Iterable) # True
isinstance(iter([1, 2]), Iterator) # True
23. プロセス・スレッド・コルーチン
| プロセス | スレッド | コルーチン | |
|---|---|---|---|
| メモリ | 独立 | 共有 | 共有 |
| 切替主体 | OS | OS | プログラマ |
24. リフレクション
class Foo:
bar = 42
f = Foo()
print(getattr(f, 'bar')) # 42
setattr(f, 'bar', 100)
25. PEP 8
Python公式コーディング規約。インデント4スペース、1行79文字、snake_case関数名など。
26. Django REST framework
認証クラス、権限クラス、スロットリング、シリアライザ、ビューセット、ルーターなどを提供し、RESTful APIを高速開発。
27. スタックとキューの実装
class Stack:
def __init__(self):
self._data = []
def push(self, item):
self._data.append(item)
def pop(self):
return self._data.pop()
class Queue:
def __init__(self):
from collections import deque
self._data = deque()
def enqueue(self, item):
self._data.append(item)
def dequeue(self):
return self._data.popleft()
28. json.dump vs json.dumps
import json
data = {'name': 'Alice'}
json_str = json.dumps(data) # str
with open('out.json', 'w') as fp:
json.dump(data, fp) # ファイル書き込み