Điều gì là nhanh hơn, A cho vòng lặp sử dụng việc liệt kê hoặc sử dụng xrange?
EDIT: Tôi đã thử nghiệm, và tôi chỉ thấy sự khác biệt tối thiểu.
hỏi ngày 31 tháng 1 năm 2011 lúc 15:56Jan 31, 2011 at 15:56
Ichigoichigoichigo
3072 Huy hiệu vàng6 Huy hiệu bạc17 Huy hiệu đồng2 gold badges6 silver badges17 bronze badges
9
Liệt kê nhanh hơn một chút. Được thử nghiệm trong Python 3:
>>>import pygame
>>>pygame.init[]
>>>clock = pygame.time.Clock[]
>>>a = list[range[100000]]
>>>def do_with_range[]:
... clock.tick[]
... k = 0
... for i in range[len[a]]:
... k += a[i]
... print[clock.tick[]]
>>>def do_with_enumerate[]:
... clock.tick[]
... k = 0
... for i, j in enumerate[a]:
... k += j
... print[clock.tick[]]
>>>do_with_range[]
23
>>>do_with_enumerate[]
21
Nếu A không phải là một danh sách, mà là một trình tạo, sẽ nhanh hơn đáng kể khi sử dụng Enumerate [74ms sử dụng phạm vi, 23ms sử dụng Enumerate].
Đã trả lời ngày 31 tháng 1 năm 2011 lúc 16:24Jan 31, 2011 at 16:24
cemper93cemper93cemper93
7484 Huy hiệu bạc18 Huy hiệu đồng4 silver badges18 bronze badges
7
Bạn có thể sử dụng mô -đun thời gian trong thư viện tiêu chuẩn để so sánh cả hai. Hàm timeit.timeit [] được sử dụng dưới đây có một tuyên bố rằng nó chạy 1'000'000 lần và trả về tổng thời gian tính bằng giây. Trong thử nghiệm này liệt kê [] chậm hơn một chút.
>>> import timeit
>>> timeit.timeit['for i in xrange[100]: a[i]', 'a = list[xrange[100]]']
7.2920000553131104
>>> timeit.timeit['for i, o in enumerate[a]: o', 'a = list[xrange[100]]']
10.359999895095825
>>> timeit.timeit['for i in xrange[100]: a[i] + 1', 'a = list[xrange[100]]']
10.380000114440918
>>> timeit.timeit['for i, o in enumerate[a]: o + 1', 'a = list[xrange[100]]']
13.514999866485596
Đã trả lời ngày 31 tháng 1 năm 2011 lúc 16:48Jan 31, 2011 at 16:48
jd.jd.jd.
10,4K3 Huy hiệu vàng45 Huy hiệu bạc55 Huy hiệu Đồng3 gold badges45 silver badges55 bronze badges
1
Mu.
Đối với các vòng lặp có thể sử dụng cả liệt kê và xrange cùng một lúc, mặc dù nó sẽ ngớ ngẩn. Hàm liệt kê thêm một chỉ mục để bạn có thể cho biết chỉ mục của một mục trong ITable của bạn là gì. Hàm xrange trả về một số lượng đầy đủ. Sử dụng nó khi bạn muốn làm điều gì đó một số lần nhất định, thay vì cho mỗi yếu tố trong một điều không thể.
Examples:
for idx, element in ['foo', 'bar', 'baz']:
print idx, element
for idx in xrange[3]:
print idx
Đã trả lời ngày 31 tháng 1 năm 2011 lúc 16:25Jan 31, 2011 at 16:25
Nmichaelsnmichaelsnmichaels
48.2K12 Huy hiệu vàng102 Huy hiệu bạc132 Huy hiệu đồng12 gold badges102 silver badges132 bronze badges
0 điểm
hơn 9 năm
choices = ['pizza', 'pasta', 'salad', 'nachos']
print 'Your choices are:'
for index, item in enumerate[choices]:
print index, item
Sự khác biệt của việc viết đó là gì, và điều này:
choices = ['pizza', 'pasta', 'salad', 'nachos']
print 'Your choices are:'
for i in range[len[choices]]:
print i, choices[i]
Ý tôi là, hàm liệt kê [] phải thêm gì, ngoài những gì có thể được thực hiện bằng cách sử dụng đơn giản cho phép lặp như mô hình thứ hai ở trên?
Trả lời 512DD114D49D94E55A001B2C
Sự khác biệt chính giữa việc sử dụng enumerate
và truy cập bằng các chỉ mục là viết ít mã hơn và làm cho mã có nhiều thời gian chạy và bộ nhớ hiệu quả hơn.
Thật dễ dàng để thấy rằng
for i, item in enumerate[list]:
ngắn hơn
for i in range[len[list]]:
item = list[i]
Đối với thời gian chạy và bộ nhớ, nó trở nên phức tạp hơn. Đầu tiên sử dụng enumerate
tạo ra một đối tượng enumerate
mà một người mang lại kết quả, do đó nhanh hơn so với việc lặp lại thông qua danh sách một lần để tìm giá trị ở chỉ mục đó [nhưng nhỏ bé của nó, không phải lo lắng]. Về bộ nhớ [ít nhất là trong Python 2.x, điều này không đúng trong Python 3.x], thực tế là bạn sử dụng cuộc gọi
>>> import timeit
>>> timeit.timeit['for i in xrange[100]: a[i]', 'a = list[xrange[100]]']
7.2920000553131104
>>> timeit.timeit['for i, o in enumerate[a]: o', 'a = list[xrange[100]]']
10.359999895095825
>>> timeit.timeit['for i in xrange[100]: a[i] + 1', 'a = list[xrange[100]]']
10.380000114440918
>>> timeit.timeit['for i, o in enumerate[a]: o + 1', 'a = list[xrange[100]]']
13.514999866485596
0 có nghĩa là bạn đang tạo một danh sách mới cần cả thời gian và bộ nhớ, đặc biệt là nếu Trình tự bạn đang lặp lại là rất dài.Có một quy tắc chung trong lập trình mà bạn không nên tối ưu hóa sớm và điều đó áp dụng ở đây. Lý do để sử dụng enumerate
thực sự chỉ là để lưu bạn một số mã. Nhưng vào cuối ngày, nó tương tự. Một điều bạn sẽ tìm thấy trong lập trình là có nhiều cách để làm một điều duy nhất.
Có một lý do nữa để sử dụng enumerate
và đó là ý tưởng tạo ra mã Python là Pythonic. Một cách dễ hiểu là một cách để mô tả dễ đọc và hiểu mã Python và được đánh giá cao trong cộng đồng nhà phát triển Python. Mặc dù có thể có 100 cách làm điều tương tự, nhưng nhìn chung chỉ có 1 hoặc 2 cách viết nó theo kiểu Pythonic.
điểm
hơn 9 năm
Sự khác biệt của việc viết đó là gì, và điều này:
Ý tôi là, hàm liệt kê [] phải thêm gì, ngoài những gì có thể được thực hiện bằng cách sử dụng đơn giản cho phép lặp như mô hình thứ hai ở trên?
điểm
hơn 9 năm