Apakah pengurangan lebih cepat daripada untuk loop python?

Catatan. Di sini, var adalah nama yang diberikan untuk variabel iterasi, iterable dapat diganti dengan fungsi range() dan dapat berupa tipe data apa pun. Pernyataan adalah langkah tindakan yang akan dilakukan

Catatan. Untuk informasi lebih lanjut, lihat Python For Loops

Contoh

Piton




# function to square a given number

def squareNum (a) :

    return a

 for var in iterable :
               statements 
0 a

 for var in iterable :
               statements 
_2

 for var in iterable :
               statements 
_2

 for var in iterable :
               statements 
4
 for var in iterable :
               statements 
5
 for var in iterable :
               statements 
6
 for var in iterable :
               statements 
7
 for var in iterable :
               statements 
8
 for var in iterable :
               statements 
9
<map object at 0x7fe413cf9b00>
[0, 1, 9, 20.25, 9801, 0.0064]
0
1
9
20.25
9801
0.0064
_____________________________________________________________________G

Saat kita memanggil

>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
_5 dengan argumen tersebut, itu tidak hanya menjumlahkan dua angka pertama. Sebaliknya itu menambahkan semua angka bersama-sama

>>> reduce(lambda x, y: x + y, numbers)
46

Fungsi pertama itu dipanggil berulang kali untuk menjumlahkan semua angka dalam daftar ini. Fungsi

>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
_5 pertama-tama memanggil fungsi yang diberikan pada dua item pertama di
>>> reduce(lambda x, y: x + y, numbers)
46
1, lalu mengambil hasil yang diperolehnya kembali dan menggunakannya bersama dengan angka ketiga sebagai dua argumen baru, dan seterusnya

Ini adalah contoh yang sedikit konyol, karena kita memiliki fungsi yang dibangun di dalam Python yang dapat melakukan ini untuk kita. Fungsi

>>> reduce(lambda x, y: x + y, numbers)
46
2 bawaan lebih mudah dipahami dan lebih cepat daripada menggunakan
>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
5

>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> sum(numbers)
46

Bahkan mengalikan angka bukanlah contoh yang bagus untuk

>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
5

>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x * y, numbers)
33264

Saat mengalikan lebih baik menggunakan fungsi

>>> reduce(lambda x, y: x + y, numbers)
46
5 dalam modul
>>> reduce(lambda x, y: x + y, numbers)
46
6 Python (ditambahkan dalam Python 3. 8) karena sekali lagi lebih cepat dan lebih mudah dibaca
>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
5

>>> from math import prod
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> prod(numbers)
33264

Kedua contoh itu adalah penggunaan

>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
_5 yang konyol, tetapi tidak semua panggilan
>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
5 dapat diringkas hanya dalam satu baris kode saja

Contoh yang lebih kompleks

Fungsi

>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> sum(numbers)
46
_0 ini memungkinkan kita untuk meminta secara mendalam kamus kamus bersarang

from functools import reduce

def deep_get(mapping, key_tuple):
    """Deeply query dict-of-dicts from given key tuple."""
    return reduce(lambda acc, val: acc[val], key_tuple, mapping)

Misalnya, inilah kamus kamus

>>> webhook_data = {
..     "event_type": "subscription_created",
..     "content": {
..         "customer": {
..             "created_at": 1575397900,
..             "card_status": "card",
..             "subscription": {
..                 "status": "active",
..                 "created_at": 1575397900,
..                 "next_billing_at": 1577817100
..             }
..         }
..     }
.. }

Kami mungkin ingin mencari kunci di kamus ini, lalu mencari kunci di kamus yang kami dapatkan kembali, dan kunci di kamus kami kembali ke sana, dan kunci di dalamnya untuk akhirnya mendapatkan nilai yang kami cari

>>> webhook_data["content"]["customer"]["subscription"]["status"]
'active'

Alih-alih melakukan kueri ini secara manual, kita dapat membuat tupel string yang mewakili kunci ini, dan meneruskan tupel itu ke fungsi

>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> sum(numbers)
46
0 kita sehingga dapat melakukan kueri untuk kita

>>> status_key = ("content", "customer", "subscription", "status")
>>> deep_get(webhook_data, status_key)
'active'

Fungsi

>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> sum(numbers)
46
_0 ini berfungsi, dan sangat kuat. Tapi itu juga cukup rumit

from functools import reduce

def deep_get(mapping, key_tuple):
    """Deeply query dict-of-dicts from given key tuple."""
    return reduce(lambda acc, val: acc[val], key_tuple, mapping)

Secara pribadi, saya menemukan fungsi

>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> sum(numbers)
46
_0 ini sulit dimengerti. Kami telah memadatkan sedikit logika menjadi hanya satu baris kode

Saya lebih suka melihat fungsi

>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> sum(numbers)
46
_0 ini diimplementasikan menggunakan
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> sum(numbers)
46
5 loop

>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
_1

Saya menemukan bahwa

>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> sum(numbers)
46
5 loop lebih mudah dipahami daripada panggilan
>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
5 yang setara

Jangan menemukan kembali roda

Bahkan jika Anda terbiasa dengan teknik pemrograman fungsional dan sangat menyukai

>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
5, Anda mungkin ingin bertanya pada diri sendiri

Apakah panggilan

>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
_5 yang akan saya gunakan lebih efisien atau kurang efisien daripada loop
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> sum(numbers)
46
5 atau alat lain yang termasuk dalam Python?

Misalnya, bertahun-tahun yang lalu, saya melihat penggunaan

>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
5 ini sebagai jawaban atas pertanyaan pemrograman online

>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
_2

Kode ini memeriksa apakah semua angka dalam daftar yang diberikan lebih besar dari nol

Kode ini berfungsi tetapi ada cara yang lebih baik untuk menyelesaikan tugas ini dengan Python

Fungsi

>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x * y, numbers)
33264
_2 bawaan di Python dapat menerima ekspresi generator yang melakukan tugas yang sama untuk kita

>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
_3

Saya menemukan bahwa panggilan

>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x * y, numbers)
33264
_2 lebih mudah dibaca, tetapi juga lebih efisien daripada panggilan
>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
5

Jika kita memiliki banyak angka dan salah satunya kurang dari atau sama dengan nol, fungsi

>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x * y, numbers)
33264
2 akan kembali lebih awal (segera setelah menemukan angka yang tidak sesuai dengan kondisi kita). Sedangkan
>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
_5 akan selalu berputar sampai akhir

Cobalah untuk menghindari menemukan kembali roda dengan

>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
5. Kode Anda akan lebih mudah dibaca (dan terkadang bahkan lebih efisien) tanpa
>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
6

Operasi umum >>> from functools import reduce >>> numbers = [2, 1, 3, 4, 7, 11, 18] >>> reduce(lambda x, y: x + y, numbers) _5 dengan Python

Berikut adalah beberapa operasi reduksi umum dalam Python serta beberapa alat yang disertakan dalam Python yang seringkali lebih efisien dan lebih mudah dibaca daripada panggilan

>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
5 yang setara

OperationWith
>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
6Without
>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
5
>>> from math import prod
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> prod(numbers)
33264
3
>>> from math import prod
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> prod(numbers)
33264
4
>>> from math import prod
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> prod(numbers)
33264
5
>>> from math import prod
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> prod(numbers)
33264
6Join strings
>>> from math import prod
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> prod(numbers)
33264
7
>>> from math import prod
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> prod(numbers)
33264
8Merge dictionaries
>>> from math import prod
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> prod(numbers)
33264
9
from functools import reduce

def deep_get(mapping, key_tuple):
    """Deeply query dict-of-dicts from given key tuple."""
    return reduce(lambda acc, val: acc[val], key_tuple, mapping)
0Set union
from functools import reduce

def deep_get(mapping, key_tuple):
    """Deeply query dict-of-dicts from given key tuple."""
    return reduce(lambda acc, val: acc[val], key_tuple, mapping)
1
from functools import reduce

def deep_get(mapping, key_tuple):
    """Deeply query dict-of-dicts from given key tuple."""
    return reduce(lambda acc, val: acc[val], key_tuple, mapping)
2Set intersection
from functools import reduce

def deep_get(mapping, key_tuple):
    """Deeply query dict-of-dicts from given key tuple."""
    return reduce(lambda acc, val: acc[val], key_tuple, mapping)
3
from functools import reduce

def deep_get(mapping, key_tuple):
    """Deeply query dict-of-dicts from given key tuple."""
    return reduce(lambda acc, val: acc[val], key_tuple, mapping)
4

Beberapa di antaranya adalah fungsi bawaan, beberapa metode pada objek bawaan, dan beberapa di perpustakaan standar

Fungsi

>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
5 Python (dalam modul
>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
4) dapat mengimplementasikan operasi reduksi kompleks hanya dengan satu baris kode. Tetapi satu baris kode itu kadang-kadang lebih membingungkan dan kurang efisien daripada loop
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> sum(numbers)
46
5 yang setara atau alat reduksi khusus lainnya yang disertakan dengan Python. Jadi saya biasanya menyarankan untuk menghindari
>>> from functools import reduce
>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> reduce(lambda x, y: x + y, numbers)
6

Apa yang lebih cepat dari for loop di Python?

Cara yang lebih cepat untuk mengulang di Python adalah menggunakan fungsi bawaan . Dalam contoh kita, kita dapat mengganti perulangan for dengan fungsi penjumlahan. Fungsi ini akan menjumlahkan nilai di dalam rentang angka. Kode di atas mengambil 0. 84 detik.

Apakah filter Python lebih cepat daripada for loop?

Fungsi peta dan filter tidak menunjukkan peningkatan kecepatan yang signifikan dibandingkan dengan loop Python murni .

Apa yang lebih cepat dari for loop?

Pemahaman daftar lebih cepat daripada perulangan for untuk membuat daftar.

Mengapa pengurangan tidak sepenuhnya direkomendasikan di Python 3?

Argumen yang menentang pengurangan adalah bahwa itu cenderung salah diterapkan, membahayakan keterbacaan dan tidak sesuai dengan orientasi non-fungsional Python.