Khi chơi xung quanh với máy phát điện, tôi cũng tìm thấy một phiên bản của itertools.product
, và nó gần như là nhanh như (bản địa) phiên bản thư viện, trong khi được 100% tương thích với nó, và nó không xây dựng kết quả trung gian :
def product(*args, **kwds):
"Alternative fast implementation of product for python < 2.6"
def cycle(sequence, uplevel):
while True:
vals = next(uplevel) # advance upper level, raises if done
it = iter(sequence) # (re-)start iteration of current level
try:
while True: yield vals + (next(it),)
except StopIteration:
pass
step = iter(((),))
for pool in map(tuple, args)*kwds.get('repeat', 1):
step = cycle(pool, step) # build stack of iterators
return step
Với python 2.7.3, tôi thấy hiệu suất thực sự tốt (thường chỉ chậm hơn khoảng 5-10 lần với mức sử dụng bộ nhớ).
>>> import itertools as itt
>>> timeit for _ in itt.product(range(20), range(3), range(150)): pass
1000 loops, best of 3: 221 µs per loop
>>> timeit for _ in product(range(20), range(3), range(150)): pass
1000 loops, best of 3: 1.14 ms per loop
Lưu ý rằng bạn sẽ cần phải xác định lại A. Khi bạn nói 'A = [(1,2,3), (3,5,7,9), (7)]' the '(7) 'ở cuối được đánh giá như một số nguyên, không phải là một tuple. Do đó nó không thể lặp lại, và 'product (* A)' sẽ ném một TypeError. Nếu bạn nói 'A = (1,2,3), (3,5,7,9), (7,)]' thì 'sản phẩm (* A)' sẽ hoạt động. – unutbu
Ok, tôi hiểu, nhưng đây là một ví dụ quá đơn giản. Tôi có A dưới dạng danh sách các bộ 3 số. Nhưng tôi muốn loại bỏ danh sách bên ngoài và nhận được A = danh sách các bộ 3 số. Làm thế nào để làm điều đó? Tốt hơn để làm điều này một câu hỏi python mới bắt đầu tôi nghĩ. – lgwest