IMO、ロックソリューションは、主に複数のスレッドが実際にそれを待っているときに、パフォーマンスに大きな影響を与えます。
競合のないロックを取得して解放するコストは、取るに足らないものでなければなりません。
このスレッドは、それに関するテストを示しています。
わかりました。Python3.2を使用したLinuxでの競合のないロックの取得と解放のコストは次のとおりです。
$ python3 -m timeit \
-s "from threading import Lock; l=Lock(); a=l.acquire; r=l.release" \
"a(); r()"
10000000 loops, best of 3: 0.127 usec per loop
そして、ダミーのPython関数を呼び出すコストは次のとおりです。
$ python3 -m timeit -s "def a(): pass" "a(); a()"
1000000 loops, best of 3: 0.221 usec per loop
そして、これが些細なC関数(Falseシングルトンを返す)を呼び出すコストです。
$ python3 -m timeit -s "a=bool" "a(); a()"
10000000 loops, best of 3: 0.164 usec per loop
また、ロックをコンテキストマネージャーとして使用すると、想像するほど速くはなく、実際には遅くなることに注意してください。
$ python3 -m timeit -s "from threading import Lock; l=Lock()" \
"with l: pass"
1000000 loops, best of 3: 0.242 usec per loop
少なくともLinuxでは、控えめに言っても、ロックのパフォーマンスを改善する余地はあまりないようです。
PS:RLockはLockと同じくらい高速になりました:
$ python3 -m timeit \
-s "from threading import RLock; l=RLock(); a=l.acquire; r=l.release" \
"a(); r()"
10000000 loops, best of 3: 0.114 usec per loop