Theo hiểu biết của tôi, range()
hàm, thực sự là một loại đối tượng trong Python 3 , tạo ra nội dung của nó một cách nhanh chóng, tương tự như một trình tạo.
Đây là trường hợp, tôi đã dự kiến dòng sau sẽ mất một lượng thời gian không phù hợp, bởi vì để xác định xem 1 triệu có trong phạm vi hay không, một giá trị một triệu sẽ được tạo ra:
1000000000000000 in range(1000000000000001)
Hơn nữa: có vẻ như cho dù tôi thêm bao nhiêu số 0, việc tính toán ít nhiều cũng mất cùng một khoảng thời gian (về cơ bản là tức thời).
Tôi cũng đã thử những thứ như thế này, nhưng tính toán vẫn gần như ngay lập tức:
1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens
Nếu tôi cố gắng thực hiện chức năng phạm vi của riêng mình, kết quả không được tốt lắm !!
def my_crappy_range(N):
i = 0
while i < N:
yield i
i += 1
return
Các range()
đối tượng đang làm gì dưới mui xe làm cho nó rất nhanh?
Câu trả lời của Martijn Pieters đã được chọn vì tính hoàn chỉnh của nó, nhưng cũng thấy câu trả lời đầu tiên của abarnert cho một cuộc thảo luận tốt về ý nghĩa của range
một chuỗi đầy đủ trong Python 3 và một số thông tin / cảnh báo về sự không nhất quán tiềm năng để __contains__
tối ưu hóa chức năng trong quá trình triển khai Python . Câu trả lời khác của abarnert đi sâu vào chi tiết hơn và cung cấp các liên kết cho những người quan tâm đến lịch sử đằng sau việc tối ưu hóa trong Python 3 (và thiếu tối ưu hóa xrange
trong Python 2). Câu trả lời bằng cách chọc và bởi wim cung cấp mã nguồn C và giải thích có liên quan cho những người quan tâm.
range
là một máy phát điện?
xrange
giống với Python3range
?
xrange()
đối tượng @Superbest không có __contains__
phương thức, vì vậy việc kiểm tra mục phải lặp qua tất cả các mục. Thêm vào đó, có một vài thay đổi khác range()
, như nó hỗ trợ cắt (một lần nữa trả về một range
đối tượng) và bây giờ cũng có count
và index
các phương thức để làm cho nó tương thích với collections.Sequence
ABC.
bool
hoặclong
loại, với các loại đối tượng khác, nó sẽ phát điên. Thử với:100000000000000.0 in range(1000000000000001)