最近書いたいくつかのコードでは、次のパターンがありました。
from zlib import crc32
new_data = get_some_input()
crc32List['stream1'] = crc32(new_data, crc32List['stream1']) & 0xffffffffL
crc32List['stream2'] = crc32(new_data, crc32List['stream2']) & 0xffffffffL
...
crc32List['streamN'] = crc32(new_data, crc32List['streamN']) & 0xffffffffL
そこでは少し冗長な計算が行われているように思われます。次のキャッシュを実行するという関数が見つかったらmagic(x, y)
、嬉しいです。
crc32List['cached'] = crc32(new_data, 0) & 0xffffffffL
crc32List['stream1'] = magic(crc32List['cached'], crc32List['stream1'])
crc32List['stream2'] = magic(crc32List['cached'], crc32List['stream2'])
...
crc32List['streamN'] = magic(crc32List['cached'], crc32List['streamN'])
' magic(x, y)
'はキャッシュされた'x'crc32値を使用し、''と同じ結果を返しcrc32(new_data, y) & 0xffffffffL
ます
もちろん、' stream[0:N]
'は異なる値で始まり、任意の時点で異なる値で終わりますが、crc32計算は、ほとんどの場合(90%+)すべてのNに対して実行され、常に' new_data
'で実行されます。