Hướng dẫn is enumerate faster than for loop python? - liệt kê có nhanh hơn for loop python không?

Đ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

Hướng dẫn is enumerate faster than for loop python? - liệt kê có nhanh hơn for loop python không?

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ướng dẫn is enumerate faster than for loop python? - liệt kê có nhanh hơn for loop python không?

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ướng dẫn is enumerate faster than for loop python? - liệt kê có nhanh hơn for loop python không?

hơn 9 năm

Python có liệt kê nhanh hơn không?

Enumerate () nhanh hơn khi bạn muốn liên tục truy cập danh sách/các mục có thể lặp lại theo chỉ mục của họ. Khi bạn chỉ muốn một danh sách các chỉ số, nó sẽ sử dụng Len () và phạm vi () nhanh hơn. Nó được hoàn thành công việc, nhưng không phải là rất pythonic.. When you just want a list of indices, it is faster to use len() and range(). It gets the job done, but not very pythonic.

Liệu việc liệt kê có làm tăng độ phức tạp thời gian không?

@10'004: liệt kê () có thể hoạt động với các trình tạo vô hạn và do đó nó không sao chép đầu vào của nó. Mặc dù nó sẽ không thay đổi độ phức tạp về thời gian ngay cả khi nó đã làm (đối với đầu vào hữu hạn).it won't change the time complexity even if it did (for a finite input).

Zip có nhanh hơn so với Loop Python không?

Trong khi những người khác đã chỉ ra rằng ZIP trên thực tế là Pythonic hơn được liệt kê, tôi đến đây để xem liệu nó có hiệu quả hơn không.Theo các thử nghiệm của tôi, ZIP nhanh hơn khoảng 10 đến 20% so với liệt kê khi chỉ cần truy cập và sử dụng các mục từ nhiều danh sách song song.zip is in fact more pythonic than enumerate , I came here to see if it was any more efficient. According to my tests, zip is around 10 to 20% faster than enumerate when simply accessing and using items from multiple lists in parallel.

Tại sao bạn sẽ sử dụng Enumerate () khi lặp lại trên một chuỗi?

Tái tạo () cho phép chúng ta lặp lại thông qua một chuỗi nhưng nó theo dõi cả chỉ mục và phần tử.Hàm liệt kê () có thể sử dụng một đối số, chẳng hạn như danh sách, chuỗi, tuple hoặc từ điển.allows us to iterate through a sequence but it keeps track of both the index and the element. The enumerate() function takes in an iterable as an argument, such as a list, string, tuple, or dictionary.