Apa "satu [...] cara yang jelas" untuk menambahkan semua item dari iterable ke yang sudah ada set
?
python
set
conventions
iterable
Ian Mackinnon
sumber
sumber
set
konstruktor mengambil iterable sebagai argumennya.{1, 2, 3}
dalam Python 3 sedangkan ituset([1, 2, 3])
dalam Python 2.Untuk kepentingan siapa pun yang mungkin percaya misalnya bahwa melakukan
aset.add()
dalam satu lingkaran akan memiliki kinerja yang kompetitif dengan melakukanaset.update()
, berikut adalah contoh bagaimana Anda dapat menguji keyakinan Anda dengan cepat sebelum go public:Sepertinya biaya per item dari pendekatan loop lebih dari TIGA kali lipat dari
update
pendekatan.Menggunakan
|= set()
biaya sekitar 1,5x apa yangupdate
dilakukan tetapi setengah dari apa yang ditambahkan setiap item dalam satu lingkaran tidak.sumber
Anda dapat menggunakan fungsi set () untuk mengubah iterable menjadi set, dan kemudian menggunakan operator pembaruan set standar (| =) untuk menambahkan nilai unik dari set baru Anda ke yang sudah ada.
sumber
.update
memiliki manfaat bahwa argumennya dapat diubah-ubah — tidak harus merupakan himpunan — tidak seperti RHS|=
operator dalam contoh Anda.|
untuk persatuan,&
untuk persimpangan, dan^
untuk mendapatkan elemen yang ada di satu atau yang lain tetapi tidak keduanya. Tetapi dalam bahasa yang diketik secara dinamis di mana kadang-kadang sulit untuk membaca kode dan mengetahui jenis benda yang terbang di sekitar, saya merasa ragu untuk menggunakan operator ini. Seseorang yang tidak mengenalinya (atau mungkin bahkan tidak menyadari bahwa Python memungkinkan untuk operator seperti ini) dapat bingung dan berpikir beberapa operasi aneh bitwise atau logis sedang terjadi. Akan lebih baik jika operator ini bekerja pada iterables lainnya juga ....update()
dan menambahkan elemen individual dalam satu lingkaran. Menemukan.update()
itu lebih cepat. Saya menambahkan hasil saya ke jawaban yang ada ini: stackoverflow.com/a/4046249/901641Hanya pembaruan cepat, timing menggunakan python 3:
hasilnya adalah:
sumber
Gunakan pemahaman daftar.
Hubungan pendek pembuatan iterable menggunakan daftar misalnya :)
[Sunting: merindukan bagian set pertanyaan]
sumber
Sebagai catatan, saya pikir pernyataan bahwa "Harus ada satu - dan lebih disukai hanya satu - cara yang jelas untuk melakukannya." adalah palsu. Itu membuat asumsi bahwa banyak orang berpikiran teknis membuat, bahwa semua orang berpikir sama. Apa yang jelas bagi satu orang tidak begitu jelas bagi orang lain.
Saya berpendapat bahwa solusi yang saya usulkan jelas dapat dibaca, dan melakukan apa yang Anda minta. Saya tidak percaya ada hit kinerja yang terlibat dengannya - meskipun saya akui saya mungkin kehilangan sesuatu. Namun terlepas dari semua itu, mungkin tidak jelas dan lebih disukai daripada pengembang lain.
sumber
aset.update(iterable)
loop pada kecepatan C sedangkanfor item in iterable: aset.add(item)
loop pada kecepatan Python, dengan pencarian metode dan pemanggilan metode (aarrgghh !!) per item.