やっぱり 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 と。