.
def rzip(a,b):
m = min(len(a),len(b))
for i in xrange(m):
yield a[-m+i],b[-m+i]
for a,b in (([1,2,3,4,5,6,7],[8,9,10]),
([1,2,3],[8,9,10]),
([1,2,3,4],[1,2,3,4,5,6,7,8,9,10])):
print list(rzip(a,b))
m - , -m + 0 0 ,
-m + 0 s >= 0
:
[(5, 8), (6, 9), (7, 10)]
[(1, 8), (2, 9), (3, 10)]
[(1, 7), (2, 8), (3, 9), (4, 10)]
, rzip() , , , ,
.
, rzip() ( eyquem1 ), , , .
eyquem1bis - rzip(), .
, zip() iterator reverseed() - .
, , rzip(), iter() islice() eyquem2 eyquem3 .
, .
import random
from time import clock
lima,limb = 20000 , 50000
a = list(range(lima))
b = list(range(limb))
random.shuffle(a)
random.shuffle(b)
A,B,C,D,E,F,G,H,I = [],[],[],[],[],[],[],[],[],
n = 10
for essays in range(100):
te = clock()
for rep in range(n):
k = min(len(a),len(b))
sam1 = list(zip(a[-k:], b[-k:]))
tref= (clock()-te)/100
A.append((clock()-te,
'Sam Hocevar, deducted normal slicing and zip'
'\nk = min(len(a),len(b))'
'\nlist(zip(a[-k:], b[-k:]))'))
te = clock()
for rep in range(n):
k = min(len(a),len(b))
sam2 = list(zip(a[len(a)-k:], b[len(b)-k:]))
tref= (clock()-te)/100
B.append((clock()-te,
'Sam Hocevar, exactly normal slicing and zip'
'\nk = min(len(a),len(b))'
'\nlist(zip(a[len(a)-k:], b[len(b)-k:]))'))
te = clock()
for rep in range(n):
fj = list(zip(a[-len(b):], b[-len(a):]))
C.append((clock()-te,
'F.J. , deducted tricky slicing and zip'
'\nlist(zip(a[-len(b):], b[-len(a):]))'))
te = clock()
for rep in range(n):
m = min(len(a),len(b))
sleep = list(zip(a[len(a)-m:],b[len(b)-m:]))
D.append((clock()-te,
'sleeplessnerd, exactly normal slicing and zip'
'\nm = min(len(a),len(b))'
'\nlist(zip(a[len(a)-m:],b[len(b)-m:]))'))
te = clock()
for rep in range(n):
m = min(len(a),len(b))
ey1 = [ (a[-m+i],b[-m+i]) for i in range(m) ]
E.append((clock()-te,
'eyquem 1, deducted normal slicing and listcomp'
'\nm = min(len(a),len(b))'
'\n[ (a[-m+i],b[-m+i]) for i in range(m) ]'))
te = clock()
for rep in range(n):
m = min(len(a),len(b))
x,y = len(a)-m , len(b)-m
ey1bis = [ (a[x+i],b[y+i]) for i in range(m)]
F.append((clock()-te,
'eyquem 1 improved, exactly normal slicing and listcomp'
'\nm = min(len(a),len(b)'
'\nx,y = len(a)-m , len(b)-m'
'\n[(a[x+i],b[y+i]) for i in range(m)]'))
te = clock()
for rep in range(n):
ita = iter(a)
itb = iter(b)
if len(b)>len(a):
for av in range(len(b)-len(a)):
itb.__next__()
else:
for av in range(len(a)-len(b)):
itb.__next__()
ey2 = list(zip(ita,itb))
G.append((clock()-te,
'eyquem 2, use of zip and iterator iter'
'\nlist(zip(ita,itb))'))
from itertools import islice
te = clock()
for rep in range(n):
if len(b)>len(a):
ey3 = list(zip(iter(a) , islice(b,len(b)-len(a),None)))
else:
ey3 = list(zip(islice(a,len(a)-len(b),None),iter(b)))
H.append((clock()-te,
'eyquem 3, use of zip and iterators iter AND islice'
'\nlist(zip(iter(a),islice(b,len(b)-len(a),None)))'))
te = clock()
for rep in range(n):
ray = list(reversed(list(zip(reversed(a),reversed(b)))))
I.append((clock()-te,
'Raymond Hettinger, use of zip and iterator reversed'
'\nlist(reversed(list(zip(reversed(a),reversed(b)))))'))
print( 'len(a) == %d\nlen(b) == %d\n' % (len(a),len(b)) )
tempi = [min(x) for x in (A,B,C,D,E,F,G,H,I)]
tempi.sort(reverse=True)
tref = tempi[0][0]/100
print( '\n\n'.join('%.2f %% %s' % (t/tref,ch) for t,ch in tempi) )
print('\nsam1==sam2==fj==sleep==ey1==ey1bis==ey2==ey3==ray is ',sam1==sam2==fj==sleep==ey1==ey1bis==ey2==ey3==ray)
:
len(a) == 20000
len(b) == 50000
100.00 % Sam Hocevar, exactly normal slicing and zip
k = min(len(a),len(b))
list(zip(a[len(a)-k:], b[len(b)-k:]))
99.80 % Sam Hocevar, deducted normal slicing and zip
k = min(len(a),len(b))
list(zip(a[-k:], b[-k:]))
98.02 % sleeplessnerd, exactly normal slicing and zip
m = min(len(a),len(b))
list(zip(a[len(a)-m:],b[len(b)-m:]))
97.98 % F.J. , deducted tricky slicing and zip
list(zip(a[-len(b):], b[-len(a):]))
82.30 % eyquem 2, use of zip and iterator iter
list(zip(ita,itb))
69.61 % eyquem 1, deducted normal slicing and listcomp
m = min(len(a),len(b))
[ (a[-m+i],b[-m+i]) for i in range(m) ]
67.62 % eyquem 1 improved, exactly normal slicing and listcomp
m = min(len(a),len(b)
x,y = len(a)-m , len(b)-m
[(a[x+i],b[y+i]) for i in range(m)]
61.23 % eyquem 3, use of zip and iterators iter AND islice
list(zip(iter(a),islice(b,len(b)-len(a),None)))
60.92 % Raymond Hettinger, use of zip and iterator reversed
list(reversed(list(zip(reversed(a),reversed(b)))))
sam1==sam2==fj==sleep==ey1==ey1bis==ey2==ey3==ray is True
:
len(a) == 49500
len(b) == 50000
100.00 % Sam Hocevar, deducted normal slicing and zip
k = min(len(a),len(b))
list(zip(a[-k:], b[-k:]))
99.39 % F.J. , deducted tricky slicing and zip
list(zip(a[-len(b):], b[-len(a):]))
99.12 % sleeplessnerd, exactly normal slicing and zip
m = min(len(a),len(b))
list(zip(a[len(a)-m:],b[len(b)-m:]))
98.10 % Sam Hocevar, exactly normal slicing and zip
k = min(len(a),len(b))
list(zip(a[len(a)-k:], b[len(b)-k:]))
69.91 % eyquem 1, deducted normal slicing and listcomp
m = min(len(a),len(b))
[ (a[-m+i],b[-m+i]) for i in range(m) ]
66.54 % eyquem 1 improved, exactly normal slicing and listcomp
m = min(len(a),len(b)
x,y = len(a)-m , len(b)-m
[(a[x+i],b[y+i]) for i in range(m)]
58.94 % Raymond Hettinger, use of zip and iterator reversed
list(reversed(list(zip(reversed(a),reversed(b)))))
51.29 % eyquem 2, use of zip and iterator iter
list(zip(ita,itb))
51.17 % eyquem 3, use of zip and iterators iter AND islice
list(zip(iter(a),islice(b,len(b)-len(a),None)))
sam1==sam2==fj==sleep==ey1==ey1bis==ey2==ey3==ray is True
, 3 :
, FJ sleepplessnerd .
zip().
, .
rzip() rzip() - 68% , , .
, .
eyquem2 eyquem3 61% .
.
:
eyquem2 eyquem3 , 2!
eyquem2 82% .
60 % Raymond Hettinger .
eyquem3 iter() islice() , , Raymond Hettinger, .