Tôi sẽ làm rõ câu trả lời này bằng cách nói rằng thời gian trên thang đo này có thể khó đo chính xác (có thể là tốt nhất để sử dụng timeit
) và các loại tối ưu hóa này hầu như không bao giờ tạo ra sự khác biệt nào trong thực tế của bạn thời gian chạy chương trình ...
Ok, bây giờ từ chối trách nhiệm được thực hiện ...
điều đầu tiên mà bạn cần phải chú ý đó là bạn chỉ thời gian xây dựng của đối tượng phát/xrange - bạn đang KHÔNG thời gian mất bao lâu để thực sự lặp lại các giá trị . Có một vài lý do tại sao tạo trình tạo có thể nhanh hơn trong một số trường hợp hơn là tạo đối tượng xrange ...
- Trường hợp máy phát điện, bạn chỉ tạo máy phát điện - Không có mã nào trong máy phát điện thực sự được chạy. Số tiền này khoảng 1 cuộc gọi hàm.
- Đối với trường hợp
xrange
, bạn đang gọi hàm và sau đó bạn đã để tra cứu tên toàn cầu xrange
, toàn cầu TOTAL
và sau đó bạn cần phải gọi BUILTIN đó - Như vậy, có có nhiều thứ được thực hiện trong trường hợp này.
Đối với bộ nhớ - Trong cả hai phương pháp lười, bộ nhớ được sử dụng sẽ bị chi phối bởi thời gian chạy python - Không phải bởi kích thước của đối tượng máy phát. Trường hợp duy nhất mà việc sử dụng bộ nhớ bị ảnh hưởng đáng kể bởi tập lệnh của bạn là trường hợp bạn xây dựng danh sách 100 triệu mục.
Cũng lưu ý rằng tôi không thể thực sự xác nhận kết quả của bạn liên tục trên hệ thống của tôi ... Sử dụng timeit
, tôi thực sự nhận được rằng my_xrange
là đôi khi nhanh hơn để xây dựng (bằng ~ 30%).
Thêm dòng sau vào dưới cùng của kịch bản của bạn:
from timeit import timeit
print timeit('my_xrange()', setup='from __main__ import my_xrange')
print timeit('my_sequence()', setup='from __main__ import my_sequence')
Và kết quả của tôi là (cho CPython
trên OS-X El-Capitan):
0.227491140366
0.356791973114
Tuy nhiên, pypy
dường như ủng hộ việc xây dựng máy phát điện (tôi đã thử nó với cả hai my_xrange
đầu tiên và my_sequence
đầu tiên và có kết quả khá phù hợp mặc dù một trong những đầu tiên để chạy dường như được tại một chút bất lợi - Có lẽ do thời gian khởi động JIT hay như vậy mething):
0.00285911560059
0.00137305259705
Ở đây, tôi sẽ mong đợixrange
để có chút lợi thế - nhưng một lần nữa, không có gì là đúng cho đến khi bạn timeit
và sau đó nó chỉ đúng nếu sự khác biệt timings là đáng kể và nó chỉ đúng trên máy tính nơi bạn đã làm timings.
Xem khai mạc từ chối trách nhiệm :-P
'xrange' là đối tượng chuỗi không phải là trình tạo, do đó nội bộ của chúng không giống hệt nhau. Bên cạnh đó, thời gian bạn đã đưa ra không thực sự cho thấy sự khác biệt đáng kể giữa xrange và trình tạo. Trong thực tế, sự khác biệt là không đáng kể – smac89
Một điều cần sửa là thực sự tạo danh sách khi bạn sử dụng 'xrange'. Trong hàm 'my_xrange', bạn chỉ trả về xrange _generator_ (nó không thực sự là máy phát). Nhưng nó chưa được xử lý vào một danh sách đầy đủ. Vì vậy, nó có thể thậm chí còn chậm hơn so với những con số ở trên. – aneroid
Bạn chỉ định thời gian cần thiết để xây dựng một máy phát điện và xây dựng một đối tượng 'xrange' - Bạn không đo lượng thời gian cần thiết để thực sự lặp lại trên các đối tượng này ... – mgilson