Những người trả lời khác đã đúng khi trả lời rằng bạn đã phát hiện ra một biểu thức trình tạo (có ký hiệu tương tự như khả năng hiểu danh sách nhưng không có dấu ngoặc vuông xung quanh).
Nói chung, genxps (như chúng được biết đến một cách trìu mến) là bộ nhớ hiệu quả hơn và nhanh hơn so với việc hiểu danh sách.
TUY NHIÊN, trong trường hợp đó ''.join()
, việc hiểu danh sách vừa nhanh hơn vừa hiệu quả hơn. Lý do là phép nối cần thực hiện hai lần chuyển dữ liệu, vì vậy nó thực sự cần một danh sách thực. Nếu bạn cho nó một cái, nó có thể bắt đầu công việc của nó ngay lập tức. Nếu bạn cung cấp cho nó một genxp thay thế, nó không thể bắt đầu hoạt động cho đến khi nó tạo một danh sách mới trong bộ nhớ bằng cách chạy genxp đến cạn kiệt:
~ $ python -m timeit '"".join(str(n) for n in xrange(1000))'
1000 loops, best of 3: 335 usec per loop
~ $ python -m timeit '"".join([str(n) for n in xrange(1000)])'
1000 loops, best of 3: 288 usec per loop
Kết quả tương tự khi so sánh itertools.imap với bản đồ :
~ $ python -m timeit -s'from itertools import imap' '"".join(imap(str, xrange(1000)))'
1000 loops, best of 3: 220 usec per loop
~ $ python -m timeit '"".join(map(str, xrange(1000)))'
1000 loops, best of 3: 212 usec per loop
join
nó rất có thể được viết bằng C và do đó chạy nhanh hơn nhiều so với việc hiểu danh sách ... Thời gian kiểm tra!