Nếu công việc bạn muốn thực hiện với các mục từ trình tạo hoán vị là CPU chuyên sâu, bạn có thể muốn sử dụng quy trình thay vì chuỗi. Khóa thông dịch toàn cầu của CPython (GIL) làm cho đa luồng có giá trị giới hạn khi thực hiện công việc liên kết CPU.
Thay vào đó, sử dụng lớp Pool
các multiprocessing
mô-đun, như vậy:
import multiprocessing
import itertools
def do_stuff(perm):
# whatever
return list(reversed(perm))
if __name__ == "__main__":
with multiprocessing.Pool() as pool: # default is optimal number of processes
results = pool.map(do_stuff, itertools.permutations('1234', r=4))
# do stuff with results
Lưu ý rằng nếu bạn sẽ được lặp lại trên results
(chứ không phải làm một cái gì đó với nó như là một danh sách), bạn có thể sử dụng imap
thay vì map
để có được một iterator mà bạn có thể sử dụng để làm việc trên các kết quả khi chúng được sản xuất từ các quy trình công nhân. Nếu nó không quan trọng thứ tự các mục được trả lại, bạn có thể sử dụng imap_unordered
để (tôi nghĩ) tiết kiệm một chút bộ nhớ.
Yêu cầu bản mẫu if __name__ is "__main__"
trên Windows, trong đó mô-đun multiprocessing
phải làm việc xung quanh giới hạn của hệ điều hành (không fork
).
làm cách nào bạn muốn chia dữ liệu giữa các chuỗi? tại sao bạn muốn sử dụng nhiều chủ đề? –
Tôi muốn chia nó đồng đều: nếu 'perms' chứa 1'000'000 mục và tôi có 4 chủ đề mỗi thread nên xử lý 250'000 mục; Nếu tôi chỉ sử dụng một thread nó mất khoảng 10 phút để đi qua toàn bộ các mục do đó tôi muốn sử dụng nhiều hơn một sợi – wasp256
chính xác quá trình của bạn, IO ràng buộc hoặc CPU bị ràng buộc là gì? –