Cách nhanh nhất để chuyển đổi một trình vòng lặp thành một danh sách


183

Có một iteratorđối tượng, có một cái gì đó nhanh hơn, tốt hơn hoặc chính xác hơn một sự hiểu biết danh sách để có được một danh sách các đối tượng được trả về?

user_list = [user for user in user_iterator]

1
Trước khi tối ưu hóa điều này, hãy chắc chắn rằng bạn đã thực hiện một số hồ sơ để chứng minh rằng đây thực sự là nút cổ chai.
S.Lott

1
@ S.Lott. Tôi thường đồng ý với thái độ đó, nhưng trong trường hợp này, nó nên được tối ưu hóa rất nhiều về mặt phong cách, như thường thấy với Python, cũng sẽ tối ưu hóa nó cho tốc độ.
aaronasterling

3
OP không nói gì về việc có một nút cổ chai. Đó là một câu hỏi chung hoàn toàn tốt với một câu trả lời đơn giản, nó không cần phụ thuộc vào một ứng dụng cụ thể có thể chạy qua một hồ sơ.
Ken Williams

4
Cách nhỏ gọn nhất là [*iterator].
Challenger5

Câu trả lời:


334
list(your_iterator)

5
Trên thực tế, hầu như luôn luôn nhanh hơn một chút. Ngoài ra, rõ ràng hơn nhiều.
Thomas Wouters

8
@systempuntoout Nó chạy hoàn toàn trong C. Việc hiểu danh sách là bằng python. Tất nhiên nó chạy nhanh hơn.
aaronasterling

3
Tôi vẫn hoàn toàn ghét rằng không có cách nào tốt hơn trong python. Thật tẻ nhạt khi phải chỉnh sửa cả hai mặt của một biểu thức để có thể cắt hoặc lập chỉ mục cho nó. (rất phổ biến trong python3, nếu đó là biểu thức thuần túy như zip hoặc bản đồ có chức năng thuần túy)
Jo So

Hừm. import matplotlib.pyplot as plt' followed by ax = plt.gca () `và list(ax._get_lines.prop_cycler)kết quả là một vòng lặp vô hạn. Có một cách thanh lịch để xử lý này?
Jens Munk

5
Trong thử nghiệm nhanh của tôi, [*your_iterator]dường như nhanh gấp đôi list(your_iterator). Điều này nói chung là đúng, hay đó chỉ là một sự kiện cụ thể? (Tôi đã sử dụng một maptrình vòng lặp.)
Neinstein

10

kể từ python 3.5, bạn có thể sử dụng *toán tử giải nén lặp lại:

user_list = [*your_iterator]

nhưng cách pythonic để làm điều đó là:

user_list  = list(your_iterator)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.