Hướng dẫn how do you count iterators in python? - làm thế nào để bạn đếm các trình vòng lặp trong python?

Tôi nghĩ rằng có thể đáng để có một điểm chuẩn vi mô so sánh các thời điểm của các phương pháp khác nhau được đề cập ở đây.

Tuyên bố miễn trừ trách nhiệm: Tôi đang sử dụng

list = [1,2,3,4,5]
iterator = iter(list)

print(iterator)
9 (một thư viện được viết bởi tôi) cho các điểm chuẩn và cũng bao gồm

0 (một chức năng trong thư viện của bên thứ ba được viết bởi tôi).

Để cung cấp một kết quả khác biệt hơn, tôi đã thực hiện hai điểm chuẩn, một chỉ bao gồm các cách tiếp cận không xây dựng một thùng chứa trung gian chỉ để vứt nó đi và một trong đó có những điều này:

from simple_benchmark import BenchmarkBuilder
import more_itertools as mi
import iteration_utilities as iu

b1 = BenchmarkBuilder()
b2 = BenchmarkBuilder()

@b1.add_function()
@b2.add_function()
def summation(it):
    return sum(1 for _ in it)

@b1.add_function()
def len_list(it):
    return len(list(it))

@b1.add_function()
def len_listcomp(it):
    return len([_ for _ in it])

@b1.add_function()
@b2.add_function()
def more_itertools_ilen(it):
    return mi.ilen(it)

@b1.add_function()
@b2.add_function()
def iteration_utilities_count_items(it):
    return iu.count_items(it)

@b1.add_arguments('length')
@b2.add_arguments('length')
def argument_provider():
    for exp in range(2, 18):
        size = 2**exp
        yield size, [0]*size

r1 = b1.run()
r2 = b2.run()

import matplotlib.pyplot as plt

f, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=[15, 18])
r1.plot(ax=ax2)
r2.plot(ax=ax1)
plt.savefig('result.png')

Kết quả là:

Hướng dẫn how do you count iterators in python? - làm thế nào để bạn đếm các trình vòng lặp trong python?

Nó sử dụng trục log-log để tất cả các phạm vi (giá trị nhỏ, giá trị lớn) có thể được kiểm tra. Vì các ô được dành cho so sánh định tính, các giá trị thực tế không quá thú vị. Nói chung, trục y (dọc) biểu thị thời gian và trục x (ngang) biểu thị số lượng các phần tử trong đầu vào "có thể lặp lại". Thấp hơn trên trục dọc có nghĩa là nhanh hơn.

Cốt truyện phía trên cho thấy các phương pháp không sử dụng danh sách trung gian. Điều này cho thấy phương pháp


1 là nhanh nhất, tiếp theo là

2 và cách chậm nhất đang sử dụng

3.

Cốt truyện thấp hơn cũng bao gồm các phương pháp sử dụng


4 trong danh sách trung gian, một lần với

5 và một lần với sự hiểu biết danh sách. Cách tiếp cận với

6 là nhanh nhất ở đây, nhưng sự khác biệt đối với phương pháp

1 gần như không đáng kể. Cách tiếp cận sử dụng sự hiểu biết chậm hơn đáng kể so với việc sử dụng

5 trực tiếp.

Bản tóm tắt

Bất kỳ cách tiếp cận nào được đề cập ở đây đều cho thấy sự phụ thuộc vào độ dài của đầu vào và lặp đi lặp lại trong các yếu tố có thể sử dụng được. Không có cách nào để có được độ dài mà không cần lặp (ngay cả khi phép lặp được ẩn).

Nếu bạn không muốn các tiện ích mở rộng của bên thứ ba thì sử dụng


9 chắc chắn là cách tiếp cận nhanh nhất của các phương pháp được thử nghiệm, tuy nhiên nó sẽ tạo ra một danh sách trung gian có thể sử dụng nhiều bộ nhớ đáng kể hơn.

Nếu bạn không bận tâm đến các gói bổ sung thì


0 sẽ gần như nhanh như hàm
print(next(iterator))
1 nhưng không yêu cầu thêm bộ nhớ.

Tuy nhiên, điều quan trọng cần lưu ý là điểm chuẩn vi mô đã sử dụng danh sách làm đầu vào. Kết quả của điểm chuẩn có thể khác nhau tùy thuộc vào khả năng mà bạn muốn có được độ dài. Tôi cũng đã thử nghiệm với

print(next(iterator))
2 và biểu hiện GenerTor đơn giản và các xu hướng rất giống nhau, tuy nhiên tôi không thể loại trừ rằng thời gian sẽ không thay đổi tùy thuộc vào loại đầu vào.

Giới thiệu

Python có rất nhiều công cụ tích hợp cho phép chúng tôi lặp lại và chuyển đổi dữ liệu. Một ví dụ tuyệt vời là mô -đun

print(next(iterator))
3, cung cấp một số chức năng lặp thuận tiện. Mỗi chức năng xây dựng vòng lặp này (chúng tạo ra các trình lặp) có thể được sử dụng một cách riêng của chúng hoặc kết hợp.iterator-building functions (they generate iterators) can be used on their own, or combined.

Mô -đun được lấy cảm hứng từ các ngôn ngữ chức năng như APL, Haskell và SPL và các phần tử trong

print(next(iterator))
3 từ Đại số lặp của Python.

Itable vs iterator

Trước khi chúng tôi đi sâu vào việc lặp lại, trước tiên chúng ta hãy xác định sự khác biệt giữa hai thuật ngữ quan trọng: có thể lặp lại và iterator.iterable and iterator.

Một ITBER là một đối tượng có thể được lặp lại. Khi sử dụng chức năng

print(next(iterator))
5, một trình lặp được tạo ra. Nói chung, hầu hết các chuỗi là có thể sử dụng được, chẳng hạn như danh sách, bộ dữ liệu, chuỗi, v.v.iterable is an object which can be iterated over. When using the
print(next(iterator))
5 function, an iterator is being generated. Generally speaking, most sequences are iterable, such as lists, tuples, strings, etc.

Một iterator cũng là một đối tượng, được sử dụng để lặp lại một lần lặp và một iterator cũng có thể tự lặp lại. Điều này được thực hiện bằng cách sử dụng phương thức

print(next(iterator))
6, chuyển trong trình lặp mà chúng tôi đang cố gắng vượt qua.iterator is also an object, which is used to iterate over an iterable and an iterator can also iterate over itself. This is done by using the
print(next(iterator))
6 method, passing in the iterator that we're trying to traverse.

Phương thức

print(next(iterator))
6 trả về phần tử tiếp theo của một đối tượng có thể lặp lại. Một trình lặp có thể được tạo ra từ một ITBER (sử dụng
print(next(iterator))
5):

list = [1,2,3,4,5]
iterator = iter(list)

print(iterator)

Kết quả này trong:


Bây giờ, hãy truy cập phần tử

print(next(iterator))
6 (bắt đầu từ phần đầu tiên) bằng cách sử dụng
1
0 của chúng tôi:

print(next(iterator))

Kết quả này trong:

1


Bây giờ, hãy truy cập phần tử

print(next(iterator))
6 (bắt đầu từ phần đầu tiên) bằng cách sử dụng
1
0 của chúng tôi:

  • count()
  • cycle()
  • chain()

Đây thực tế là những gì xảy ra dưới mui xe của vòng lặp 1 1 - nó gọi print(next(iterator)) 5 trên bộ sưu tập bạn đang lặp lại và sau đó, phần tử print(next(iterator)) 6 được truy cập 1 4 lần.

Trong hướng dẫn này, chúng tôi sẽ xem xét một vài công cụ lặp Python:

Hàm số ()

from itertools import count

iterator_count = count(start=0, step=5)

for i in iterator_count:
    if(i == 25):
        break
    print(i)

Hàm

1
5 tạo ra một trình lặp và được sử dụng để tạo các giá trị cách đều nhau, trong đó không gian giữa chúng được xác định bởi đối số
1
6. Đối số
1
7 xác định giá trị bắt đầu của trình lặp - và chúng được đặt thành
1
8 và
1
9 theo mặc định.
Using
from itertools import count

iterator_count = count(start=0, step=5)

for i in iterator_count:
    if(i == 25):
        break
    print(i)
0 like this is unusual. You'd typically chain it with other methods, such as
from itertools import count

iterator_count = count(start=0, step=5)

for i in iterator_count:
    if(i == 25):
        break
    print(i)
2,
from itertools import count

iterator_count = count(start=0, step=5)

for i in iterator_count:
    if(i == 25):
        break
    print(i)
3, or
from itertools import count

iterator_count = count(start=0, step=5)

for i in iterator_count:
    if(i == 25):
        break
    print(i)
4.

Không có điều kiện phanh, chức năng

from itertools import count

iterator_count = count(start=0, step=5)

for i in iterator_count:
    if(i == 25):
        break
    print(i)
0 sẽ tiếp tục đếm vô thời hạn (trên một hệ thống có bộ nhớ không xác định):

0
5
10
15
20

Lưu ý: Sử dụng

from itertools import count

iterator_count = count(start=0, step=5)

for i in iterator_count:
    if(i == 25):
        break
    print(i)
0 như thế này là bất thường. Bạn thường xếp nó với các phương pháp khác, chẳng hạn như
from itertools import count

iterator_count = count(start=0, step=5)

for i in iterator_count:
    if(i == 25):
        break
    print(i)
2,
from itertools import count

iterator_count = count(start=0, step=5)

for i in iterator_count:
    if(i == 25):
        break
    print(i)
3 hoặc
from itertools import count

iterator_count = count(start=0, step=5)

for i in iterator_count:
    if(i == 25):
        break
    print(i)
4.

Trình lặp lặp lại ở đây, in các giá trị trong các bước 5:

from itertools import count

list = ['John', 'Marie', 'Jack', 'Anna']
for i in zip(count(), list):
    print(i)

Kết quả này trong:

(0, 'John')
(1, 'Marie')
(2, 'Jack')
(3, 'Anna')

Bây giờ, hãy truy cập phần tử

print(next(iterator))
6 (bắt đầu từ phần đầu tiên) bằng cách sử dụng
1
0 của chúng tôi:

Đây thực tế là những gì xảy ra dưới mui xe của vòng lặp

1
1 - nó gọi
print(next(iterator))
5 trên bộ sưu tập bạn đang lặp lại và sau đó, phần tử
print(next(iterator))
6 được truy cập
1
4 lần.

Trong hướng dẫn này, chúng tôi sẽ xem xét một vài công cụ lặp Python:

Hàm số ()

Hàm

1
5 tạo ra một trình lặp và được sử dụng để tạo các giá trị cách đều nhau, trong đó không gian giữa chúng được xác định bởi đối số
1
6. Đối số
1
7 xác định giá trị bắt đầu của trình lặp - và chúng được đặt thành
1
8 và
1
9 theo mặc định.
Given this fact, using
from itertools import count

iterator_count = count(start=0, step=5)

for i in iterator_count:
    if(i == 25):
        break
    print(i)
7, especially for longer sequences is extremely memory-burdening.

Không có điều kiện phanh, chức năng

from itertools import count

iterator_count = count(start=0, step=5)

for i in iterator_count:
    if(i == 25):
        break
    print(i)
0 sẽ tiếp tục đếm vô thời hạn (trên một hệ thống có bộ nhớ không xác định):

from itertools import cycle

list = [1,2,3,4]
iterator = cycle(list)

for i in iterator:
    print(i)

Kết quả này trong:

list = [1,2,3,4,5]
iterator = iter(list)

print(iterator)
0


Bây giờ, hãy truy cập phần tử

print(next(iterator))
6 (bắt đầu từ phần đầu tiên) bằng cách sử dụng
1
0 của chúng tôi:

list = [1,2,3,4,5]
iterator = iter(list)

print(iterator)
1

Đây thực tế là những gì xảy ra dưới mui xe của vòng lặp

1
1 - nó gọi
print(next(iterator))
5 trên bộ sưu tập bạn đang lặp lại và sau đó, phần tử
print(next(iterator))
6 được truy cập
1
4 lần.

list = [1,2,3,4,5]
iterator = iter(list)

print(iterator)
2

Trong hướng dẫn này, chúng tôi sẽ xem xét một vài công cụ lặp Python:

Hàm số ()

list = [1,2,3,4,5]
iterator = iter(list)

print(iterator)
3

Hàm

1
5 tạo ra một trình lặp và được sử dụng để tạo các giá trị cách đều nhau, trong đó không gian giữa chúng được xác định bởi đối số
1
6. Đối số
1
7 xác định giá trị bắt đầu của trình lặp - và chúng được đặt thành
1
8 và
1
9 theo mặc định.

list = [1,2,3,4,5]
iterator = iter(list)

print(iterator)
4

Không có điều kiện phanh, chức năng

from itertools import count

iterator_count = count(start=0, step=5)

for i in iterator_count:
    if(i == 25):
        break
    print(i)
0 sẽ tiếp tục đếm vô thời hạn (trên một hệ thống có bộ nhớ không xác định):

Lưu ý: Sử dụng

from itertools import count

iterator_count = count(start=0, step=5)

for i in iterator_count:
    if(i == 25):
        break
    print(i)
0 như thế này là bất thường. Bạn thường xếp nó với các phương pháp khác, chẳng hạn như
from itertools import count

iterator_count = count(start=0, step=5)

for i in iterator_count:
    if(i == 25):
        break
    print(i)
2,
from itertools import count

iterator_count = count(start=0, step=5)

for i in iterator_count:
    if(i == 25):
        break
    print(i)
3 hoặc
from itertools import count

iterator_count = count(start=0, step=5)

for i in iterator_count:
    if(i == 25):
        break
    print(i)
4.

Cái trước có thể đạt được bằng một phương pháp khác, xuất phát từ hàm

0
5
10
15
20
1 -
0
5
10
15
20
7:

list = [1,2,3,4,5]
iterator = iter(list)

print(iterator)
5

Hàm

0
5
10
15
20
1 hoạt động giống như trước đây chúng ta đã quan sát - nó chuỗi các yếu tố như hiện tại. Mặt khác, phương pháp
0
5
10
15
20
7 coi từng yếu tố là một yếu tố có thể lặp lại và trả về các yếu tố cấu thành của nó cùng với các yếu tố khác bị phá vỡ theo cùng một kiểu:

list = [1,2,3,4,5]
iterator = iter(list)

print(iterator)
6

Thông thường, bạn sẽ sử dụng

0
5
10
15
20
7 để tính tổng số chữ số, chứa trong một số bộ sưu tập mà bạn lần đầu tiên cùng nhau chuỗi lại, sau đó tính toán
from itertools import count

list = ['John', 'Marie', 'Jack', 'Anna']
for i in zip(count(), list):
    print(i)
1 cho:

list = [1,2,3,4,5]
iterator = iter(list)

print(iterator)
7

Mỗi yếu tố của bộ sưu tập

from itertools import count

list = ['John', 'Marie', 'Jack', 'Anna']
for i in zip(count(), list):
    print(i)
2 là một danh sách khác. Vì các danh sách có thể sử dụng được, cuộc gọi
0
5
10
15
20
7 đã chia chúng thành một danh sách duy nhất chứa các yếu tố từ
from itertools import count

list = ['John', 'Marie', 'Jack', 'Anna']
for i in zip(count(), list):
    print(i)
4, sau đó chúng tôi tính toán
from itertools import count

list = ['John', 'Marie', 'Jack', 'Anna']
for i in zip(count(), list):
    print(i)
1 của chúng và in kết quả:

list = [1,2,3,4,5]
iterator = iter(list)

print(iterator)
8

Sự kết luận

Mô -đun

print(next(iterator))
3 giới thiệu cho chúng tôi một số chức năng tiện lợi hữu ích để làm việc với lặp và lặp lại.

Nhiều trong số này có thể được sử dụng làm chức năng thuận tiện độc lập, nhưng chúng thường bị xích nhất với các chức năng khác để chuyển đổi dữ liệu.