Hướng dẫn how to avoid for loops in python - cách tránh vòng lặp for trong python

Tôi hiểu rằng các vòng lặp là một ý tưởng tồi trong Python và tôi nên tránh chúng.

Chà, tôi có một vài trong số những người tôi muốn tránh.

Tôi có một danh sách những thứ có tên Lipid:

class bead:
    x = 0
    y = 0
    z = 0
    LID = 0
    t = 0

class lipid:
    h = bead[]
    b = bead[]
    t = bead[]
    LID = 0

Và tôi đang làm như sau [mã bên dưới]:

  1. Khởi tạo một mảng 2D của
     for LID in lipids:
            l = lipids[LID]
            up = l.h.z > l.t.z
            X = [int][l.b.x*8/L]
            Y = [int][l.b.y*8/L]
            Z = [l.b.z]*0.5
            if up:
                hs[X][Y].hU += Z
                hs[X][Y].cU += 1
            else:
                hs[X][Y].hD += Z
                hs[X][Y].cD += 1
    
    1 trên tất cả các lipid và
  2. Xác định xem chúng được tính là
     for LID in lipids:
            l = lipids[LID]
            up = l.h.z > l.t.z
            X = [int][l.b.x*8/L]
            Y = [int][l.b.y*8/L]
            Z = [l.b.z]*0.5
            if up:
                hs[X][Y].hU += Z
                hs[X][Y].cU += 1
            else:
                hs[X][Y].hD += Z
                hs[X][Y].cD += 1
    
    2 hoặc xuống
  3. Thêm giá trị vào
     for LID in lipids:
            l = lipids[LID]
            up = l.h.z > l.t.z
            X = [int][l.b.x*8/L]
            Y = [int][l.b.y*8/L]
            Z = [l.b.z]*0.5
            if up:
                hs[X][Y].hU += Z
                hs[X][Y].cU += 1
            else:
                hs[X][Y].hD += Z
                hs[X][Y].cD += 1
    
    1 thích hợp

Làm thế nào tôi có thể tránh, ít nhất, vòng đầu tiên?

1:

class h:
    cU = 0
    cD = 0
    hU = 0
    hD = 0
    h = 0

  for i in range[0,8]:
        hs.append[[]]
        for j in range[0,8]:
            index = [i,j]
            hn = h[]
            hs[i].append[hn]

2 và 3:

 for LID in lipids:
        l = lipids[LID]
        up = l.h.z > l.t.z
        X = [int][l.b.x*8/L]
        Y = [int][l.b.y*8/L]
        Z = [l.b.z]*0.5
        if up:
            hs[X][Y].hU += Z
            hs[X][Y].cU += 1
        else:
            hs[X][Y].hD += Z
            hs[X][Y].cD += 1

Các kỹ thuật đơn giản để tránh vòng lặp cơ bản và tạo thuật toán nhanh hơn

[Hình ảnh của Mikkekylilt trên Unplash]]

Giới thiệu

Các vòng lặp; Thông thường là một thành phần quan trọng trong phần giới thiệu của chúng tôi về nghệ thuật điện toán. Vòng lặp For là một công cụ đa năng thường được sử dụng để thao tác và làm việc với các cấu trúc dữ liệu. Đối với nhiều hoạt động, bạn có thể sử dụng cho các vòng lặp để đạt được điểm số khá tốt khi hiệu suất trong khi vẫn hoàn thành một số hoạt động quan trọng. Tuy nhiên, trong Python hiện đại, có nhiều cách xung quanh việc thực hành điển hình của bạn cho vòng lặp có thể được sử dụng. Điều này có thể nhanh hơn thông thường để sử dụng vòng lặp trong Python. Điều đó đang được nói, đó chắc chắn là một điều tuyệt vời mà các tùy chọn này có sẵn, trong một số trường hợp, chúng có thể được sử dụng để tăng tốc mã Python! Ngoài ra, nếu bạn muốn xem nguồn để đi cùng với bài viết này, bạn có thể làm như vậy ở đây:

Thêm về For Loop…

Trước khi chúng tôi đi sâu vào một số cách tuyệt vời để không sử dụng cho Loop, chúng ta hãy xem xét giải quyết một số vấn đề với các vòng lặp trong Python. Điều này sẽ cho phép chúng tôi lưu ý cách sử dụng vòng lặp trong các kịch bản lập trình điển hình. Ngoài ra, chúng ta có thể xem xét các vấn đề về hiệu suất mà các vòng lặp có thể gây ra. Chúng ta hãy xem xét Pythonic truyền thống nhất cho vòng lặp mà nhiều người trong chúng ta có thể học được khi chọn ngôn ngữ:

data = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]for i in data:
print[i]

Cách tiếp cận này có một vài vấn đề. Mặc dù ví dụ như thế này, với lượng dữ liệu nhỏ này, điều này chắc chắn sẽ hoạt động tốt - và trong hầu hết các trường hợp có thể là như vậy, có một số cách tiếp cận pythonic tốt hơn - chúng ta có thể sử dụng để tăng tốc mã. Đối với các vòng theo nghĩa rất thông thường này có thể tránh được khá nhiều. Trong một số trường hợp, cú pháp này có thể bị thu hẹp thành một cuộc gọi phương thức duy nhất. Vấn đề với các vòng lặp là chúng có thể là một sự treo cổ rất lớn cho thời gian xử lý. Điều này không bao giờ có thể nói là ném các vòng lặp hoàn toàn ra, một số người có từ hộp công cụ lập trình của họ. Thay vào đó, tôi nói, nắm lấy mục đích-chỉ là lập trường mà người ta nên có trên bất kỳ thành phần công nghệ nào.

Vòng lặp cho một mục đích cụ thể, nhưng cũng làm một số tùy chọn trong danh sách này. Một điều làm cho một lập trình viên trở nên tuyệt vời là khả năng chọn một ngăn xếp phù hợp với trung đoàn hiện tại của họ. Điều này đi xuống để chọn đúng, các mô -đun, chức năng và những thứ có tính chất đó. Không ai trên hành tinh có đủ thời gian để tìm hiểu mọi mô-đun và mọi cuộc gọi có sẵn cho họ, vì vậy hãy cân nhắc những người mà người ta có thể học và đọc các bài viết tổng quan về các tùy chọn mới, chắc chắn là một cách tuyệt vời để đảm bảo rằng bộ kỹ năng của một người rất đa dạng đầy đủ.

Lý do tại sao các vòng lặp có thể có vấn đề thường được liên kết với việc xử lý một lượng lớn dữ liệu hoặc trải qua rất nhiều bước với dữ liệu đã nói. Một số công cụ trong danh sách này đặc biệt tốt về điều này hay thứ khác, và đó là sức mạnh của các kỹ thuật này đến từ.

1: 1 dòng cho vòng lặp.

Vòng lặp 1 dòng là một ví dụ kinh điển về hack cú pháp mà tất cả chúng ta nên tận dụng. Có một vài đặc điểm của vòng lặp 1 dòng khiến nó khác biệt với các vòng thông thường. Rõ ràng nhất là nó được chứa trong một dòng.

[print[i] for i in data]

Một điều quan trọng khác về loại vòng lặp này là nó cũng sẽ cung cấp lợi nhuận. Với ví dụ in, vì mỗi ví dụ chỉ là đầu ra tiêu chuẩn, chúng tôi thực sự được trả lại một mảng các nothings. Tính năng này rất quan trọng cần lưu ý, bởi vì nó làm cho các ứng dụng cho loại vòng lặp này rất rõ ràng. Vòng lặp này là tối ưu để thực hiện các hoạt động nhỏ trên một mảng các giá trị. Hãy để chúng tôi viết một chức năng nhanh chóng để áp dụng một số thống kê cho các giá trị của chúng tôi. Dưới đây là hai chức năng hỗ trợ, một trong số đó thực sự sử dụng 1 dòng cho vòng lặp mà tôi đã đánh bại để trình diễn:

import math
"""
mean[x : list]
Returns the mean of a list.
"""
def mean[x : list]:
return[sum[x] / len[x]]
"""
std[x : list]
Returns the standard deviation [std] of a list.
"""
def std[x : list]:
m = mean[x]
x = [[i - m] ** 2 for i in x]
m = mean[x]
m = math.sqrt[m]
return[m]

Hàm đầu tiên là một hàm trung bình đơn giản, sau đó được sử dụng trong hàm độ lệch chuẩn dưới đây. Điều này sử dụng một vòng lặp một dòng để vuông dữ liệu, giá trị trung bình của được thu thập, sau đó căn bậc hai của giá trị trung bình đó được thu thập. Bây giờ đối với thành phần cuối cùng của chúng tôi, chúng tôi sẽ viết một chức năng phân phối bình thường, sẽ tiêu chuẩn quy mô dữ liệu này. Chúng tôi sẽ mở rộng từng giá trị theo một dòng cho vòng lặp.

def normal[x : list]:
mu = mean[x]
sigma = std[x]

Các giá trị này là cần thiết cho một dòng của chúng tôi cho vòng lặp. Cú pháp hoạt động bằng cách tạo một trình lặp bên trong của một khoảng trống trống, sau đó mảng được nhân đôi thành mảng mới. Sự thay thế cho điều này là nối tiếp hoặc đẩy. Chúng ta hãy xem phiên bản một dòng:

return[[[i - mu] / sigma for i in x]]

Hãy để sử dụng %thời gian để kiểm tra thời gian này mất bao lâu. Vào cuối bài viết này, tôi sẽ so sánh tất cả các lần trong ứng dụng này để đo tùy chọn nào có thể là tốt nhất.

import numpy.random as rd
x = rd.randn[10000]
%timeit normal[data]
3.37 µs ± 136 ns per loop [mean ± std. dev. of 7 runs, 100000 loops each]

2: Lambda

Kỹ thuật tiếp theo chúng ta sẽ xem xét là Lambda. Lambda là một kỹ thuật dễ dàng mà chúng ta có thể sử dụng bên trong Python để tạo ra các biểu thức. Các biểu thức này sau đó có thể được đánh giá qua một phương thức sử dụng phương thức application []. Tất nhiên cũng có rất nhiều cách khác để sử dụng Lambda. Đối với ví dụ hôm nay, chúng tôi sẽ áp dụng Lambda vào mảng của chúng tôi để thông thường phân phối dữ liệu của chúng tôi. Tôi thực sự đã viết một bài viết một thời gian trước nói về tất cả về những gì tuyệt vời về Lambda. Nếu bạn muốn đọc về kỹ thuật này nhiều hơn một chút, bạn có thể làm như vậy ở đây:

Lambda cực kỳ dễ sử dụng, và thực sự chỉ nên mất vài giây để học. Tuy nhiên, khi một người mới bắt đầu, thật dễ dàng để biết lý do tại sao tất cả các loại kiến ​​thức Lambda có thể trở nên khó hiểu. Hãy cùng xem xét việc áp dụng Lambda cho chức năng của chúng tôi. Vấn đề chúng ta sẽ phải đối mặt là cuối cùng Lambda không hoạt động tốt trong việc thực hiện này. Lambda là một thành phần, tuy nhiên, điều đó được nói; May mắn thay, có những ứng dụng mà chúng tôi có thể kết hợp một thành phần khác từ danh sách này với Lambda để tạo một vòng lặp làm việc sử dụng Lambda để áp dụng các hoạt động khác nhau. Trong ví dụ về chức năng của chúng tôi, ví dụ:

def normallambda[x : list]:
mu = mean[x]
sigma = std[x]

Đầu tiên chúng tôi xác định biểu thức Lambda:

class h:
    cU = 0
    cD = 0
    hU = 0
    hD = 0
    h = 0

  for i in range[0,8]:
        hs.append[[]]
        for j in range[0,8]:
            index = [i,j]
            hn = h[]
            hs[i].append[hn]
0

Sau đó, chúng tôi sử dụng vòng lặp 1 dòng để áp dụng biểu thức của chúng tôi trên dữ liệu của chúng tôi:

class h:
    cU = 0
    cD = 0
    hU = 0
    hD = 0
    h = 0

  for i in range[0,8]:
        hs.append[[]]
        for j in range[0,8]:
            index = [i,j]
            hn = h[]
            hs[i].append[hn]
1

№3: Áp dụng

Cho rằng nhiều người trong chúng ta làm việc trong Python là các nhà khoa học dữ liệu, có khả năng nhiều người trong chúng ta làm việc với gấu trúc. Nếu đó là trường hợp, tôi mong muốn giới thiệu cho bạn phương thức Ứng dụng [] từ gấu trúc. Chức năng này được chứa trong các khung dữ liệu gấu trúc và cho phép người ta sử dụng các biểu thức lambda để hoàn thành tất cả các loại điều tuyệt vời. Tất nhiên, để thực sự làm việc với điều này, chúng ta sẽ cần phải sử dụng thư viện Pandas ngay từ đầu. Hãy để chúng tôi nhanh chóng đưa dữ liệu của chúng tôi vào DataFrame:

class h:
    cU = 0
    cD = 0
    hU = 0
    hD = 0
    h = 0

  for i in range[0,8]:
        hs.append[[]]
        for j in range[0,8]:
            index = [i,j]
            hn = h[]
            hs[i].append[hn]
2

Bây giờ chúng tôi sẽ viết chức năng mới của mình, lưu ý rằng loại đã thay đổi thành pd.dataframe và các cuộc gọi bị thay đổi một chút:

class h:
    cU = 0
    cD = 0
    hU = 0
    hD = 0
    h = 0

  for i in range[0,8]:
        hs.append[[]]
        for j in range[0,8]:
            index = [i,j]
            hn = h[]
            hs[i].append[hn]
3

Bây giờ chúng ta hãy sử dụng cuộc gọi Lambda của chúng ta. Không có gì thay đổi về điều này từ vòng lặp sang phương thức áp dụng:

class h:
    cU = 0
    cD = 0
    hU = 0
    hD = 0
    h = 0

  for i in range[0,8]:
        hs.append[[]]
        for j in range[0,8]:
            index = [i,j]
            hn = h[]
            hs[i].append[hn]
0

Khi sử dụng phương thức application [], nó có thể được gọi cả loại sê -ri và DataFrame. Vì vậy, trong trường hợp này, vì chúng tôi đang làm việc với một chuỗi 1 chiều và không cần phải áp dụng điều này cho toàn bộ phạm vi của khung dữ liệu này, chúng tôi sẽ sử dụng chuỗi. Chúng ta có thể gọi chuỗi bằng cách lập chỉ mục DataFrame với [].

class h:
    cU = 0
    cD = 0
    hU = 0
    hD = 0
    h = 0

  for i in range[0,8]:
        hs.append[[]]
        for j in range[0,8]:
            index = [i,j]
            hn = h[]
            hs[i].append[hn]
5

Đối với một chức năng cuối cùng trông như thế này:

class h:
    cU = 0
    cD = 0
    hU = 0
    hD = 0
    h = 0

  for i in range[0,8]:
        hs.append[[]]
        for j in range[0,8]:
            index = [i,j]
            hn = h[]
            hs[i].append[hn]
6

№4: itertools

Một cách tuyệt vời chúng ta có thể giải quyết vấn đề này từ một chút quan điểm thực hiện cơ sở là bằng cách sử dụng itertools. Mô -đun ITERTOOLS được bao gồm trong thư viện tiêu chuẩn Python và là một công cụ tuyệt vời mà tôi muốn giới thiệu việc sử dụng mọi lúc. Những gì nó là triển khai thành Python của các thuật toán phổ biến và nhanh chóng để xử lý dữ liệu có thể được làm việc để hoàn thành công việc bằng cách sử dụng ít python. Tôi có toàn bộ bài viết đi sâu vào chi tiết về sự tuyệt vời của itertools mà bạn có thể xem nếu bạn muốn ở đây:

Vấn đề là, có rất nhiều điều mà thư viện này cung cấp - vì vậy tôi rất vui vì người ta có thể điều tra bài báo đó để thêm một chút ở đây - bởi vì bây giờ tôi sẽ viết chức năng này và gọi nó là một ngày. Tôi chắc chắn nghĩ rằng việc đọc thêm một chút vào mô -đun này được bảo đảm trong hầu hết các trường hợp, nó thực sự là một công cụ tuyệt vời và linh hoạt để có trong kho vũ khí của bạn.

class h:
    cU = 0
    cD = 0
    hU = 0
    hD = 0
    h = 0

  for i in range[0,8]:
        hs.append[[]]
        for j in range[0,8]:
            index = [i,j]
            hn = h[]
            hs[i].append[hn]
7

Chức năng chính mà chúng ta sẽ sử dụng cho ví dụ này là itertools.cycle. Phương pháp này tạo ra tạo ra một trình lặp mới cho mảng đó. Chúng ta cũng có thể thêm số học vào điều này, điều này làm cho nó hoàn hảo cho việc thực hiện này.

class h:
    cU = 0
    cD = 0
    hU = 0
    hD = 0
    h = 0

  for i in range[0,8]:
        hs.append[[]]
        for j in range[0,8]:
            index = [i,j]
            hn = h[]
            hs[i].append[hn]
8

№5: WHER

Một cách cuối cùng và có lẽ bất ngờ người ta có thể tránh sử dụng thông thường cho các vòng lặp trong mã của chúng là bằng cách sử dụng trong khi. Tất nhiên, cũng sẽ có những trường hợp đây là một lựa chọn khủng khiếp. Tương tự như vậy, có những trường hợp đây là lựa chọn tốt nhất có sẵn. Thông thường, khi nói đến Iterables, trong khi vòng lặp rất hiếm khi được sử dụng.

Tuy nhiên, chúng ta hãy suy nghĩ về lý do tại sao trong khi vòng lặp không được sử dụng cho một thứ như vậy. Thứ nhất, một vòng lặp trong thời gian phải bị phá vỡ. Đây cũng là trường hợp của các vòng lặp có thể lặp lại, nhưng chỉ vì điều đó đã hoàn thành việc lặp lại [hoặc có một số thiết lập phá vỡ ngoài một điều kiện hoặc một cái gì đó.] -Loopy-Things.

class h:
    cU = 0
    cD = 0
    hU = 0
    hD = 0
    h = 0

  for i in range[0,8]:
        hs.append[[]]
        for j in range[0,8]:
            index = [i,j]
            hn = h[]
            hs[i].append[hn]
9

Điều thực sự kéo vòng trong khi xuống là tất cả các tính toán mà người ta phải làm để khiến nó chạy giống như một vòng lặp. Chắc chắn có những trường hợp điều này có thể có ích, nhưng trong ví dụ này, tôi không nghĩ rằng điều này viết tốt hơn một thông thường cho vòng lặp. Có rất nhiều khởi tạo, giống như chúng ta sẽ cần với một vòng lặp thường xuyên.

Sự kết luận

Tất nhiên, có nhiều cách tiếp cận khác mà người ta có thể có vấn đề này. Không có giải pháp nào tốt hơn một giải pháp khác trong tất cả các ứng dụng, tôi nghĩ rằng có sức mạnh cho mỗi một trong những công cụ khác nhau này. Cách mà một lập trình viên sử dụng và tương tác với các vòng lặp của chúng chắc chắn là một đóng góp quan trọng cho kết quả cuối cùng của một mã có thể phản ánh. Chúng ta hãy xem xét tất cả các kỹ thuật này và các ứng dụng của chúng cho vấn đề phân phối của chúng tôi, và sau đó xem kỹ thuật nào đã làm tốt nhất trong kịch bản cụ thể này. Đây là cách mà hàm sẽ được viết với một kiểu tiêu chuẩn, thẳng về phía trước:

 for LID in lipids:
        l = lipids[LID]
        up = l.h.z > l.t.z
        X = [int][l.b.x*8/L]
        Y = [int][l.b.y*8/L]
        Z = [l.b.z]*0.5
        if up:
            hs[X][Y].hU += Z
            hs[X][Y].cU += 1
        else:
            hs[X][Y].hD += Z
            hs[X][Y].cD += 1
0

Sau khi so sánh Swift, người chiến thắng ở đây là phương thức df.apply [] từ gấu trúc trong trường hợp này. Điều này nói gì về Python? Trong nhiều trường hợp, mặc dù có vẻ hợp pháp hơn khi làm những việc với các biểu thức pythonic thông thường, nhưng có những lúc bạn không thể đánh bại một thư viện dựa trên C. Pandas có thể vượt ra ngoài bất kỳ mã python nào chúng ta viết, cả hai đều thể hiện những gấu trúc tuyệt vời như thế nào và việc sử dụng C từ Python có thể tuyệt vời như thế nào. Tuy nhiên, vị trí thứ hai, và một giây gần, là nội tuyến cho vòng lặp. Trong trường hợp, nơi tùy chọn đó có thể cần thay thế, chắc chắn nó có thể được khuyến nghị sử dụng kỹ thuật đó. Một lưu ý khác cũng là không có lần nào được bao gồm thực sự tạo các loại đã được sử dụng, có thể là một bất lợi nhỏ cho phương thức Ứng dụng [], vì dữ liệu của bạn phải ở trong một khung dữ liệu. Cảm ơn bạn rất nhiều vì đã đọc bài viết của tôi! Tôi hy vọng nó là sâu sắc và truyền cảm hứng lý tưởng đối với mã Python của bạn! Lập trình vui vẻ!

Làm thế nào để bạn tránh sử dụng một vòng lặp?

Một cách cuối cùng và có lẽ bất ngờ người ta có thể tránh sử dụng thông thường cho các vòng lặp trong mã của chúng là bằng cách sử dụng trong khi. Tất nhiên, cũng sẽ có những trường hợp đây là một lựa chọn khủng khiếp. Tương tự như vậy, có những trường hợp đây là lựa chọn tốt nhất có sẵn.using while. Of course, there will also be instances where this is a terrible choice. Likewise, there are instances where this is the best choice available.

Tôi có thể sử dụng gì thay vì cho các vòng lặp trong Python?

Hàm bản đồ [] là một sự thay thế cho một vòng lặp.Nó áp dụng một chức năng cho từng yếu tố của một điều khác.map[] function is a replacement to a for a loop. It applies a function for each element of an iterable.

Làm thế nào để bạn dừng một vòng lặp trong Python?

Python cung cấp hai từ khóa chấm dứt một lần lặp vòng lặp sớm: Tuyên bố Break Python ngay lập tức chấm dứt hoàn toàn một vòng lặp.Thực hiện chương trình tiến hành tuyên bố đầu tiên sau cơ thể vòng lặp.Tuyên bố Python tiếp tục ngay lập tức chấm dứt lặp lại vòng lặp hiện tại.The Python break statement immediately terminates a loop entirely. Program execution proceeds to the first statement following the loop body. The Python continue statement immediately terminates the current loop iteration.

Làm thế nào để bạn tránh nhiều vòng trong Python?

5 cách để thoát ra khỏi các vòng lồng nhau trong Python.Không thanh lịch như nó phải được.....
Thêm một biến cờ.Đây là một giải pháp hiệu quả.....
Nâng cao một ngoại lệ.Nếu chúng ta không thể sử dụng từ khóa Break như mong đợi.....
Kiểm tra lại điều kiện tương tự.....
Sử dụng cú pháp For-Else.....
Đặt nó vào một chức năng ..

Bài Viết Liên Quan

Chủ Đề