Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from time import time
- import functools
- import random
- #########################################################
- a = (1, 2, {'knee': 4}, 5, 9, 10, 7, [8,9], 9, 10)
- b = [(5,6), [7,8], [9,'arrow'], [1,2], {'5': 6}, [6,0], 7, {8:9}, (9,10), 0]
- c = {'arrow': 5, 'knee': 'guard', 0: ('x',2), 'Python': ('dog',5),'Saitama': -10,
- 42: 'Life', 'Area': 51, 8: 8, '9': (1,1), 10: 'end'}
- #########################################################
- def ordered_shuffle(*args):
- _args = [arg if type(arg)!=dict else arg.items() for arg in args]
- args_split = [arg for arg in zip(*_args)]
- args_shuffled = random.sample(args_split, len(args_split))
- args_shuffled = map(tuple, zip(*args_shuffled))
- return [type(args[i])(arg) for i, arg in enumerate(args_shuffled)]
- @functools.singledispatch
- def shuffle(arg, order):
- lst = list(arg)
- return type(arg)(lst[i] for i in order)
- @shuffle.register(dict)
- def _(arg, order):
- item = list(arg.items())
- return dict(item[i] for i in order)
- #########################################################
- def ordered_shuffle2(*args):
- min_length = min(map(len, args))
- indices = random.sample(range(min_length), min_length)
- return [shuffle(arg, indices) for arg in args]
- ordered_shuffle3 = lambda *args:[type(args[i])(arg) for i, arg in
- enumerate(map(tuple, zip(
- *random.sample([y for y in zip(*[x if type(x)!=dict else x.items()
- for x in args])], min(len(z) for z in args)
- ))))]
- #########################################################
- def ordered_shuffle4(*args):
- min_length = min(map(len, args))
- idx = list(range(min_length))
- random.shuffle(idx)
- results = []
- for arg in args:
- if isinstance(arg, list):
- results.append([arg[i] for i in idx])
- elif isinstance(arg, tuple):
- results.append(tuple(arg[i] for i in idx))
- elif isinstance(arg, dict):
- items = list(arg.items())
- results.append(dict(items[i] for i in idx))
- else:
- raise ValueError(
- "Encountered", type(arg),
- "expecting only list, dict, or tuple"
- )
- return results # 155.7 195.3 160.45 131.87
- #########################################################
- iters = int(1e7)
- t0 = time()
- for _ in range(iters):
- ordered_shuffle(a, b, c)
- t1_bench = time() - t0
- print('ordered_shuffle: %s' % t1_bench)
- t0 = time()
- for _ in range(iters):
- ordered_shuffle2(a, b, c)
- t2_bench = time() - t0
- print('ordered_shuffle2: %s' % t2_bench)
- t0 = time()
- for _ in range(iters):
- ordered_shuffle3(a, b, c)
- t3_bench = time() - t0
- print('ordered_shuffle3: %s' % t3_bench)
- t0 = time()
- for _ in range(iters):
- ordered_shuffle4(a, b, c)
- t4_bench = time() - t0
- print('ordered_shuffle4: %s' % t4_bench)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement