在我最近编写的一些代码中,我有这种模式:
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'])
' ' 使用缓存的 'x' crc32 值并返回与 ' 'magic(x, y)
相同的结果crc32(new_data, y) & 0xffffffffL
当然 ' stream[0:N]
' 以不同的值开始并在任何时间点以不同的值结束,但 crc32 计算几乎总是对所有 N 执行 (90%+) 并且总是以 ' new_data
'