Код: Выделить всё
def xs():
yield [1, 2]
yield [3, 4]
def ys():
yield [5, 6]
yield [7, 8]
Код: Выделить всё
process([1, 2], [5, 6])
process([1, 2], [7, 8])
process([3, 4], [5, 6])
process([3, 4], [7, 8])
Код: Выделить всё
from itertools import product
for x, y in product(xs(), ys()):
process(x, y)
Код: Выделить всё
def process(x, y):
print(f'process({x}, {y})')
x.pop()
y.pop()
Код: Выделить всё
process([1, 2], [5, 6])
process([1], [7, 8])
process([3, 4], [5])
process([3], [7])
Это немного лучше:
Код: Выделить всё
for x in xs():
for y in ys():
process(x, y)
Код: Выделить всё
process([1, 2], [5, 6])
process([1], [7, 8])
process([3, 4], [5, 6])
process([3], [7, 8])
Код: Выделить всё
from copy import deepcopy
for x in xs():
for y in ys():
process(deepcopy(x), y)
Код: Выделить всё
0.6 ± 0.0 ms using_product
3.1 ± 0.0 ms nested_loops
404.7 ± 25.9 ms with_deepcopy
Сценарий бенчмарка/тестирования:
Код: Выделить всё
def using_product(xs, ys, process):
for x, y in product(xs(), ys()):
process(x, y)
def nested_loops(xs, ys, process):
for x in xs():
for y in ys():
process(x, y)
def with_deepcopy(xs, ys, process):
for x in xs():
for y in ys():
process(deepcopy(x), y)
funcs = [
using_product,
nested_loops,
with_deepcopy,
]
from itertools import *
from copy import deepcopy
from timeit import timeit
from statistics import mean, stdev
import sys
import random
# The little example
def xs():
yield [1, 2]
yield [3, 4]
def ys():
yield [5, 6]
yield [7, 8]
def process(x, y):
print(f'process({x}, {y})')
x.pop()
y.pop()
for f in funcs:
print(f.__name__ + ':')
f(xs, ys, process)
print()
# Arguments for benchmark
def xs():
for _ in range(100):
yield [1] * 100
ys = xs
def process(x, y):
pass
# Run the benchmark
times = {f: [] for f in funcs}
def stats(f):
ts = [t * 1e3 for t in sorted(times[f])[:5]]
return f'{mean(ts):5.1f} ± {stdev(ts):3.1f} ms '
for _ in range(25):
random.shuffle(funcs)
for f in funcs:
t = timeit(lambda: f(xs, ys, process), number=1)
times[f].append(t)
for f in sorted(funcs, key=stats):
print(stats(f), f.__name__)
print('\nPython:', sys.version)
Подробнее здесь: https://stackoverflow.com/questions/783 ... hout-reuse