Hai, Habr. Seringkali ketika bekerja dengan urutan, muncul pertanyaan tentang kreasi mereka. Tampaknya digunakan untuk menggunakan
Daftar inklusi (Pemahaman Daftar) , dan dalam buku-buku berteriak tentang penggunaan wajib fungsi
peta built-in.
Dalam artikel ini, kami akan mempertimbangkan pendekatan ini untuk bekerja dengan urutan, membandingkan kinerja, dan juga menentukan di mana situasi pendekatan mana yang lebih baik.
Daftar pemahaman
Daftar inklusi adalah mekanisme penghasil daftar yang dibangun ke dalam Python. Dia hanya memiliki satu tugas - untuk membangun daftar. Daftar inklusi membangun daftar dari jenis yang dapat diubah, mengubah (memfilter) nilai yang masuk.
Contoh penyertaan daftar sederhana untuk menghasilkan daftar kuadrat angka dari 0 hingga 9:
squares = [x*x for x in range(10)]
Hasil:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
peta
peta adalah fungsi yang dibangun ke dalam bahasa. Ini menerima fungsi sebagai parameter pertama, dan objek iterable sebagai parameter kedua. Mengembalikan generator (Python 3.x) atau daftar (Python 2.x). Saya akan memilih Python 3.
Contoh memanggil fungsi peta untuk menghasilkan daftar kotak angka dari 0 hingga 9:
squares = list(map(lambda x: x*x, range(10)))
Hasil:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Perbandingan kinerja
Bangun tanpa fungsi
Sebagai percobaan, kami akan mempertimbangkan kuadrat angka dari interval dari 0 hingga 9.999.999:
python -m timeit -r 10 "[x*x for x in range(10000000)]" python -m timeit -r 10 "list(map(lambda x: x*x, range(10000000)))"
Hasil:
1 loop, best of 10: 833 msec per loop 1 loop, best of 10: 1.22 sec per loop
Seperti yang Anda lihat, metode
Pemahaman Daftar bekerja sekitar 32% lebih cepat. Setelah dibongkar, tidak mungkin mendapatkan jawaban yang lengkap, karena fungsi peta "tampaknya menyembunyikan detail pekerjaannya". Tetapi kemungkinan besar ini disebabkan oleh panggilan fungsi lambda yang konstan, di mana perhitungan kuadratnya sudah dilakukan. Dalam hal Pemahaman Daftar, kita hanya perlu menghitung kuadrat.
Bangun dengan fitur
Sebagai perbandingan, kami juga akan mempertimbangkan kuadrat angka, tetapi perhitungan sekarang akan berada di dalam fungsi:
python -m timeit -r 10 -s "def pow2(x): return x*x" "[pow2(x) for x in range(10000000)]" python -m timeit -r 10 -s "def pow2(x): return x*x" "list(map(pow2, range(10000000)))"
Hasil:
1 loop, best of 10: 1.41 sec per loop 1 loop, best of 10: 1.21 sec per loop
Kali ini situasinya terbalik. Metode
peta 14% lebih cepat. Dalam contoh ini, kedua metode berada dalam situasi yang sama. Keduanya harus memanggil fungsi untuk menghitung kuadrat. Namun, optimalisasi internal fungsi peta memungkinkannya menampilkan hasil yang lebih baik.
Apa yang harus dipilih?
Di bawah ini adalah aturan untuk memilih metode yang tepat:

Mungkin ada pengecualian untuk aturan ini, tetapi dalam kebanyakan kasus ini akan membantu Anda membuat pilihan yang tepat!
apakah peta "lebih aman"?
Kenapa banyak yang mendesak penggunaan
peta . Faktanya adalah bahwa dalam beberapa kasus peta sebenarnya lebih aman daripada List Comprehension.
Sebagai contoh:
symbols = ['a', 'b', 'c'] values = [1, 2, 3] for x in symbols: print(x) squared = [x*x for x in values]
Output dari program ini adalah sebagai berikut:
a 3 b 3 c 3
Sekarang tulis ulang kode yang sama menggunakan
peta :
symbols = ['a', 'b', 'c'] values = [1, 2, 3] for x in symbols: print(x) squared = map(lambda x: x*x, values)
Kesimpulan:
a a b b c c
Yang paling jeli sudah bisa melihat dari sintaks menggunakan
peta bahwa ini adalah Python 2. Memang, di python kedua ada masalah serupa dengan variabel overwriting. Namun, dalam Python 3, masalah ini telah diperbaiki dan tidak lagi relevan.
Contoh yang dijelaskan di atas akan menunjukkan hasil yang sama. Mungkin juga terlihat bahwa ini adalah kesalahan bodoh dan Anda tidak akan pernah membuat kesalahan seperti itu, namun, ini bisa terjadi ketika Anda hanya mentransfer satu blok kode dengan loop dalam dari blok lain. Kesalahan seperti itu bisa menghabiskan banyak waktu dan saraf untuk memperbaikinya.
Kesimpulan
Perbandingan menunjukkan bahwa masing-masing metode baik dalam situasinya.
- Jika Anda tidak memerlukan semua nilai yang dihitung sekaligus (atau mungkin tidak diperlukan sama sekali), maka Anda harus memilih peta . Jadi, sesuai kebutuhan, Anda akan meminta sebagian data dari generator, sambil menyimpan sejumlah besar memori (Python 3. Dalam Python 2, ini tidak masuk akal, karena peta mengembalikan daftar).
- Jika Anda perlu menghitung semua nilai sekaligus dan perhitungan dapat dilakukan tanpa menggunakan fungsi, maka Anda harus membuat pilihan ke arah Pemahaman Daftar . Seperti yang ditunjukkan oleh hasil percobaan - ini memiliki keunggulan signifikan dalam kinerja.
PS: Jika saya melewatkan sesuatu, saya senang mendiskusikannya dengan Anda di komentar.