やっぱり slice (without zip)
noreはzipがtuple吐いてるのが重いのと、そこからさらに連結作業が入るせいかな。
まぁ、そりゃそうだなとかおもったので、zip を使わないのも合わせて、timeit で Benchmarkとか
import re from itertools import izip pat = re.compile('..') def checksum_re(s): return hex(sum(int(x, 16) for x in pat.findall(s))) def checksum_zip(s): return hex(sum(int(x + y, 16) for x, y in zip(s[0::2], s[1::2]))) def checksum_izip(s): return hex(sum(int(x + y, 16) for x, y in izip(s[0::2], s[1::2]))) def checksum_slice(s): return hex(sum(int(s[i:i+2], 16) for i in xrange(0, len(s), 2))) TEST_STRING = 'CAFEBABE' if __name__ == '__main__': from timeit import Timer functions = 're zip izip slice'.split() setup = 'from __main__ import TEST_STRING\n' setup += 'from __main__ import ' + ', '.join('checksum_%s' % f for f in functions) for f in functions: stmt = 'checksum_%s(TEST_STRING)' % f print '%5s' % f, print Timer(stmt = stmt, setup = setup).timeit(100000)
re 1.52160847259 zip 1.63252033429 izip 1.54968047615 slice 1.14170823387
まぁ、そんな感じ。環境は Pentium M 2GHz で Windows Vista + Python 2.5.2 と。