Bagaimana menghindari loop di dalam loop dengan python

Untuk loop; . Perulangan for adalah alat serbaguna yang sering digunakan untuk memanipulasi dan bekerja dengan struktur data. Untuk banyak operasi, Anda dapat menggunakan for loop untuk mencapai skor yang cukup bagus dalam hal kinerja sambil tetap menyelesaikan beberapa operasi yang signifikan. Namun, dalam Python modern, ada beberapa cara untuk melatih loop khas Anda yang dapat digunakan. Ini bisa lebih cepat daripada konvensional untuk penggunaan loop di Python. Meskipun demikian, tentu merupakan hal yang luar biasa bahwa opsi ini tersedia, dalam beberapa keadaan opsi ini dapat digunakan untuk mempercepat kode Python. Juga, jika Anda ingin melihat sumber untuk mengikuti artikel ini, Anda dapat melakukannya di sini

GitHub - emmettgb/Emmetts-DS-NoteBooks. Buku catatan acak untuk berbagai proyek

Ini adalah buku catatan sumber terbuka saya, jangan ragu untuk membuka dan membaca, mengunduh, dan bercabang, dll. Portofolio Saya Anda juga bisa…

github. com

Lebih lanjut tentang for loop…

Sebelum kita menyelami beberapa cara luar biasa untuk tidak menggunakan for loop, mari kita lihat penyelesaian beberapa masalah dengan for loop di Python. Ini akan memungkinkan kita untuk mencatat bagaimana loop digunakan dalam skenario pemrograman biasa. Selain itu, kita dapat melihat masalah kinerja yang mungkin disebabkan oleh for loop. Mari kita lihat loop Pythonic for paling tradisional yang mungkin banyak dari kita pelajari saat mempelajari bahasanya

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

Pendekatan ini memiliki beberapa masalah. Meskipun untuk contoh seperti ini, dengan jumlah data yang kecil ini, ini pasti akan berfungsi dengan baik - dan dalam banyak kasus mungkin demikian, ada beberapa pendekatan Pythonic yang lebih baik - lebih banyak yang dapat kita gunakan untuk mempercepat kode. Untuk loop dalam pengertian yang sangat konvensional ini dapat dihindari sepenuhnya. Dalam beberapa kasus, sintaks ini dapat diperkecil menjadi satu pemanggilan metode. Masalah dengan for loop adalah mereka bisa menjadi hambatan besar untuk waktu pemrosesan. Ini bukan untuk mengatakan "membuang for loop sepenuhnya," seperti yang dikatakan beberapa orang dari kotak alat pemrograman mereka. Saya malah mengatakan, rangkul tujuan - hanya sikap yang harus dimiliki seseorang pada komponen tumpukan teknologi apa pun

Perulangan for memiliki tujuan tertentu, tetapi juga beberapa opsi pada daftar ini. Satu hal yang membuat seorang programmer hebat adalah kemampuan untuk memilih tumpukan yang sesuai dengan resimen mereka saat ini. Ini bermuara pada memilih yang benar, modul, fungsi, dan hal-hal semacam itu. Tidak seorang pun di planet ini yang memiliki cukup waktu untuk mempelajari setiap modul dan setiap panggilan yang tersedia bagi mereka, jadi menimbang yang dapat dipelajari, dan membaca artikel yang meninjau opsi baru, tentu saja merupakan cara yang bagus untuk memastikan bahwa keahlian seseorang beragam.

Alasan mengapa loop bisa bermasalah biasanya terkait dengan pemrosesan data dalam jumlah besar, atau melalui banyak langkah dengan data tersebut. Beberapa alat dalam daftar ini sangat bagus dalam satu atau lain hal, dan dari situlah kekuatan teknik ini berasal

№1. 1-baris untuk loop

1-baris for loop adalah contoh klasik dari peretasan sintaksis yang harus kita manfaatkan. Ada beberapa karakteristik dari loop for 1-baris yang membedakannya dari loop for biasa. Yang paling jelas adalah bahwa itu terkandung dalam satu baris

[print(i) for i in data]
_

Hal penting lainnya tentang loop semacam ini adalah ia juga akan memberikan pengembalian. Dengan contoh cetak, karena setiap contoh hanyalah keluaran standar, kami sebenarnya mengembalikan array tak berguna. Fitur ini penting untuk diperhatikan, karena membuat aplikasi untuk loop semacam ini sangat jelas. Loop ini optimal untuk melakukan operasi kecil di berbagai nilai. Mari kita menulis fungsi cepat untuk menerapkan beberapa statistik pada nilai kita. Berikut adalah dua fungsi pendukung, salah satunya benar-benar menggunakan 1-line for loop yang saya siapkan untuk demonstrasi

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)

Fungsi pertama adalah fungsi rata-rata sederhana, yang kemudian digunakan dalam fungsi standar deviasi di bawah ini. Ini menggunakan for-loop satu baris untuk mengkuadratkan data, yang rata-ratanya dikumpulkan, lalu akar kuadrat dari rata-rata itu dikumpulkan. Sekarang untuk komponen terakhir kita, kita akan menulis fungsi distribusi normal, yang akan menskalakan data ini secara standar. Kami akan menskalakan setiap nilai dalam satu baris untuk loop

def normal(x : list):
mu = mean(x)
sigma = std(x)

Nilai-nilai ini diperlukan untuk perulangan for satu baris kita. Sintaksnya bekerja dengan membuat iterator di dalam iterable kosong, kemudian array tersebut digandakan ke dalam array baru. Alternatif untuk ini adalah menambahkan atau mendorong. Mari kita lihat versi satu baris

return([(i - mu) / sigma for i in x])
_

Mari kita gunakan %timeit untuk memeriksa berapa lama waktu yang dibutuhkan untuk melakukannya. Di akhir artikel ini, saya akan membandingkan semua waktu dalam aplikasi ini untuk mengukur opsi mana yang terbaik

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

Teknik selanjutnya yang akan kita lihat adalah Lambda. Lambda adalah teknik mudah yang bisa kita gunakan di dalam Python untuk membuat ekspresi. Ekspresi ini kemudian dapat dievaluasi melalui iterable menggunakan metode apply(). Ada banyak cara lain untuk menggunakan lambda tentunya juga. Untuk contoh hari ini, kami akan menerapkan lambda ke array kami untuk mendistribusikan data kami secara normal. Saya benar-benar menulis artikel beberapa waktu lalu yang berbicara tentang apa yang hebat tentang Lambda. Jika Anda ingin mempelajari teknik ini lebih lanjut, Anda dapat melakukannya di sini

Python Ilmiah Dengan Lambda

Arti yang tepat dari penggunaan yang tepat dari fungsi Lambda Python. Sintaks terbesar Python untuk pemrograman ilmiah

menuju ilmu data. com

Lambda sangat mudah digunakan, dan hanya perlu beberapa detik untuk mempelajarinya. Namun, ketika seseorang baru memulai, mudah untuk melihat mengapa semua jenis pengetahuan lambda bisa membingungkan. Mari kita lihat penerapan lambda ke fungsi kita. Masalah yang akan kita hadapi adalah lambda pada akhirnya tidak bekerja dengan baik dalam implementasi ini. Lambda lebih merupakan komponen, bagaimanapun, itu dikatakan; . Dalam contoh fungsi kita, misalnya

def normallambda(x : list):
mu = mean(x)
sigma = std(x)
_

Pertama kita mendefinisikan ekspresi lambda

ex = lambda x: x - mu / sigma

Kemudian kami menggunakan for-loop 1-baris untuk menerapkan ekspresi kami di seluruh data kami

return([ex(y) for y in x])
_№3. Menerapkan

Mengingat banyak dari kita yang bekerja dengan Python adalah Ilmuwan Data, kemungkinan banyak dari kita bekerja dengan Panda. Jika itu yang terjadi, saya ingin memperkenalkan Anda pada metode apply() dari Pandas. Fungsi ini terdapat di dalam Pandas DataFrames, dan memungkinkan seseorang untuk menggunakan ekspresi Lambda untuk menyelesaikan semua jenis hal mengagumkan. Tentu saja, untuk benar-benar bekerja dengan ini, pertama-tama kita harus menggunakan pustaka Pandas. Mari kita segera memasukkan data kita ke dalam DataFrame

import pandas as pd
df = pd.DataFrame({"X" : x})
_

Sekarang kita akan menulis fungsi baru kita, perhatikan bahwa tipenya berubah menjadi pd. DataFrame, dan panggilannya sedikit diubah

[print(i) for i in data]
_0

Sekarang mari kita gunakan panggilan lambda kita. Tidak ada yang berubah tentang ini dari perulangan ke metode penerapan

ex = lambda x: x - mu / sigma

Saat menggunakan metode apply() , ini bisa dibatalkan baik tipe Seri maupun DataFrame. Jadi dalam contoh ini, karena kita bekerja dengan deret 1 dimensi dan tidak perlu menerapkannya ke seluruh cakupan DataFrame ini, kita akan menggunakan deret. Kita dapat memanggil seri dengan mengindeks DataFrame dengan []

[print(i) for i in data]
_2

Untuk fungsi akhir yang terlihat seperti ini

[print(i) for i in data]
_3№4. Itertools

Cara luar biasa untuk mengatasi masalah ini dari perspektif implementasi dasar adalah dengan menggunakan itertools. Modul itertools disertakan dalam pustaka standar Python, dan merupakan alat luar biasa yang akan saya rekomendasikan untuk digunakan sepanjang waktu. Apa itu implementasi ke dalam Python dari algoritme yang populer dan cepat untuk menangani data yang dapat dikerjakan untuk menyelesaikan sesuatu menggunakan lebih sedikit Python. Saya memiliki seluruh artikel yang merinci kehebatan itertools yang dapat Anda periksa jika Anda mau di sini

Python Cepat Jahat Dengan Itertools

Sekilas tentang cara mudah membuat Python lebih cepat dan lebih efektif untuk pembelajaran mesin dengan menggunakan itertools…

menuju ilmu data. com

Masalahnya, ada banyak hal yang ditawarkan perpustakaan ini — jadi saya senang orang dapat menyelidiki artikel itu lebih lanjut di sini — karena untuk saat ini saya hanya akan menulis fungsi ini dan menghentikannya sehari. Saya benar-benar berpikir bahwa membaca lebih banyak tentang modul ini diperlukan dalam banyak kasus, ini benar-benar alat yang luar biasa dan serbaguna untuk dimiliki di gudang senjata Anda.

[print(i) for i in data]
_4

Fungsi utama yang akan kita gunakan untuk contoh ini adalah itertools. siklus. Metode ini membuat membuat iterator baru untuk array itu. Kami juga dapat menambahkan aritmatika untuk ini, yang membuatnya sempurna untuk implementasi ini

[print(i) for i in data]
_5№5. Ketika

Satu cara terakhir, dan mungkin tak terduga yang bisa dihindari menggunakan for loop konvensional dalam kode mereka adalah dengan menggunakan while. Tentu saja, akan ada juga contoh di mana ini adalah pilihan yang buruk. Demikian pula, ada beberapa contoh di mana ini adalah pilihan terbaik yang tersedia. Biasanya, jika menyangkut iterables, perulangan sangat jarang digunakan

Namun, mari kita pikirkan mengapa while looping tidak digunakan untuk hal seperti itu. Pertama, while loop harus dipatahkan. Ini adalah kasus untuk loop iterable juga, tetapi hanya karena iterable telah menyelesaikan iterasi (atau ada beberapa pengaturan istirahat di luar kondisional atau sesuatu. ) Artinya, pasti ada beberapa implementasi di mana while loop melakukan beberapa hal yang sangat iteratif-loopy

[print(i) for i in data]
_6

Apa yang benar-benar menyeret while loop ke bawah adalah semua perhitungan yang harus dilakukan untuk membuatnya berjalan lebih seperti for loop. Tentu saja ada contoh di mana ini mungkin berguna, tetapi dalam contoh ini, saya hanya tidak berpikir ini menulis lebih baik daripada for loop konvensional. Ada banyak inisialisasi, seperti yang kita perlukan dengan perulangan for biasa

Kesimpulan

Tentu saja, ada lebih banyak pendekatan yang bisa dilakukan untuk masalah semacam ini. Tidak ada solusi yang lebih baik dari yang lain di semua aplikasi, saya pikir ada kekuatan untuk masing-masing alat yang berbeda ini. Cara seorang programmer menggunakan dan berinteraksi dengan loop mereka jelas merupakan kontributor yang signifikan terhadap bagaimana hasil akhir dari kode seseorang mungkin mencerminkan. Mari kita lihat semua teknik ini, dan penerapannya pada masalah distribusi kita, lalu lihat teknik mana yang terbaik dalam skenario khusus ini. Ini adalah cara fungsi akan ditulis dengan gaya for-loop standar dan lurus ke depan

[print(i) for i in data]
_7

Setelah perbandingan cepat, pemenangnya adalah df. apply() metode dari Pandas dalam contoh ini. Apa yang dikatakan tentang Python? . Panda dapat mengungguli kode Python apa pun yang kita tulis, yang keduanya menunjukkan betapa hebatnya Panda, dan betapa hebatnya penggunaan C dari Python. Namun tempat kedua, dan yang kedua, adalah for-loop inline. Dalam kasus, di mana opsi itu mungkin perlu diganti, mungkin disarankan untuk menggunakan teknik itu. Catatan lain juga bahwa tidak ada waktu yang disertakan untuk benar-benar membuat tipe yang digunakan, yang mungkin sedikit merugikan metode Apply(), karena data Anda harus dalam DataFrame. Terima kasih banyak telah membaca artikel saya. Saya harap ini berwawasan luas, dan idealnya menginspirasi kode Python Anda. Selamat pemrograman

Bagaimana Anda menghindari lingkaran di dalam lingkaran?

Kompleksitas memiliki loop bersarang dalam kasus Anda adalah O(n * m) - n panjang orderArr , dan m panjang myArr. Kompleksitas solusi ini adalah O(n + m) karena kita membuat objek kamus menggunakan Array#reduce dengan kompleksitas O(m), lalu memfilter orderArray dengan kompleksitas O( . .

Bagaimana Anda menghindari loop bersarang?

Anda dapat mengubah loop bersarang menjadi sesuatu yang tidak terlihat seperti loop bersarang. Misalnya, Anda dapat mengubah ini. untuk (int i = 0; i < N; ++i) { .
untuk (x = 0; x < 10; x++) {
melakukan sesuatu berkali-kali

Bagaimana Anda menghentikan loop bersarang di Python?

5 Cara Keluar dari Nested Loops dengan Python. Tidak seanggun yang seharusnya. .
Tambahkan Variabel Bendera. Ini adalah solusi yang efektif. .
Angkat Pengecualian. Jika kita tidak bisa menggunakan kata kunci break seperti yang diharapkan. .
Periksa Kondisi yang Sama Lagi. .
Gunakan Sintaks For-Else. .
Masukkan ke dalam Fungsi

Haruskah Anda menghindari loop for bersarang?

Loop bersarang seringkali (namun tidak selalu) merupakan praktik yang buruk, karena loop bersarang seringkali (namun tidak selalu) berlebihan untuk apa yang Anda coba lakukan. In many cases, there's a much faster and less wasteful way to accomplish the goal you're trying to achieve.