В качестве альтернативы:
>>> hexstring = "01234567"
>>> it=iter(hexstring); [a+b for a,b in zip(it, it)]
['01', '23', '45', '67']
Используйте itertools.izip
вместо zip
, если вы нацелены на Python 2.x.
Этот метод является определенной версией grouper
в рецепте itertools.
Некоторые микро-тесты:
$ python2.6 -m timeit -s 'hexstring = "01234567"*500' '[hexstring[i:i+2] for i in xrange(0,len(hexstring), 2)]'
1000 loops, best of 3: 409 usec per loop
$ python2.6 -m timeit -s 'hexstring = "01234567"*500' '[hexstring[i:i+2] for i in range(0,len(hexstring), 2)]'
1000 loops, best of 3: 438 usec per loop
$ python2.6 -m timeit -s 'hexstring = "01234567"*500' 'it=iter(hexstring); [a+b for a,b in zip(it, it)]'
1000 loops, best of 3: 526 usec per loop
$ python2.6 -m timeit -s 'hexstring = "01234567"*500; from itertools import izip' 'it=iter(hexstring); [a+b for a,b in izip(it, it)]'
1000 loops, best of 3: 406 usec per loop
$ python2.6 -m timeit -s 'hexstring = "01234567"*500; import re; r=re.compile(".{1,2}"); f=r.findall' 'f(hexstring)'
1000 loops, best of 3: 458 usec per loop
$ python3.1 -m timeit -s 'hexstring = "01234567"*500' '[hexstring[i:i+2] for i in range(0,len(hexstring), 2)]'
1000 loops, best of 3: 756 usec per loop
$ python3.1 -m timeit -s 'hexstring = "01234567"*500' 'it=iter(hexstring); [a+b for a,b in zip(it, it)]'
1000 loops, best of 3: 414 usec per loop
$ python3.1 -m timeit -s 'hexstring = "01234567"*500; import re; r=re.compile(".{1,2}"); f=r.findall' 'f(hexstring)'
1000 loops, best of 3: 865 usec per loop
$ python2.6 -m timeit -s 'hexstring = "01234567"' '[hexstring[i:i+2] for i in xrange(0,len(hexstring), 2)]'
1000000 loops, best of 3: 1.52 usec per loop
$ python2.6 -m timeit -s 'hexstring = "01234567"' '[hexstring[i:i+2] for i in range(0,len(hexstring), 2)]'
1000000 loops, best of 3: 1.76 usec per loop
$ python2.6 -m timeit -s 'hexstring = "01234567"' 'it=iter(hexstring); [a+b for a,b in zip(it, it)]'
100000 loops, best of 3: 3.78 usec per loop
$ python2.6 -m timeit -s 'hexstring = "01234567"; from itertools import izip' 'it=iter(hexstring); [a+b for a,b in izip(it, it)]'
100000 loops, best of 3: 2.39 usec per loop
$ python2.6 -m timeit -s 'hexstring = "01234567"; import re; r=re.compile(".{1,2}"); f=r.findall' 'f(hexstring)'
1000000 loops, best of 3: 1.45 usec per loop
$ python3.1 -m timeit -s 'hexstring = "01234567"' '[hexstring[i:i+2] for i in range(0,len(hexstring), 2)]'
100000 loops, best of 3: 2.46 usec per loop
$ python3.1 -m timeit -s 'hexstring = "01234567"' 'it=iter(hexstring); [a+b for a,b in zip(it, it)]'
1000000 loops, best of 3: 1.84 usec per loop
$ python3.1 -m timeit -s 'hexstring = "01234567"; import re; r=re.compile(".{1,2}"); f=r.findall' 'f(hexstring)'
100000 loops, best of 3: 2.07 usec per loop
Наблюдение:
- С длинными строками на Python 2.6, @ SilentGhost и мой метод самые быстрые. Конечно, вам нужно использовать ленивые итераторы, например,
xrange
и izip
.
- С короткими строками в Python 2.6, регулярное выражение @ Nick является самым быстрым.
- На Python 3.1 мой метод самый быстрый в обоих случаях, но я считаю, что это потому, что Python 3.x менее оптимизирован.
- Конечно, преждевременная оптимизация - это зло и т. Д. .