Saya telah melihat sebenarnya ada dua (mungkin lebih) cara untuk menggabungkan daftar dengan Python: Salah satu caranya adalah dengan menggunakan metode extended ():
a = [1, 2]
b = [2, 3]
b.extend(a)
yang lain untuk menggunakan operator plus (+):
b += a
Sekarang saya bertanya-tanya: Manakah dari dua opsi itu yang merupakan cara 'pythonic' untuk melakukan daftar concatenation dan apakah ada perbedaan di antara keduanya (saya telah melihat tutorial Python resmi tetapi tidak dapat menemukan apa pun tentang topik ini).
.__iadd__()
/.__add__()
/.__radd__()
versus.extend()
Jawaban:
Satu-satunya perbedaan pada tingkat bytecode adalah bahwa
.extend
cara melibatkan pemanggilan fungsi, yang sedikit lebih mahal di Python daripadaINPLACE_ADD
.Ini benar-benar tidak perlu Anda khawatirkan, kecuali jika Anda melakukan operasi ini miliaran kali. Namun demikian, kemungkinan kemacetan akan terletak di tempat lain.
sumber
.__iadd__()
/.__add__()
/.__radd__()
versus.extend()
Anda tidak dapat menggunakan + = untuk variabel non-lokal (variabel yang bukan lokal untuk fungsi dan juga bukan global)
Itu karena untuk memperpanjang case compiler akan memuat variabel
l
menggunakanLOAD_DEREF
instruksi, tetapi untuk + = itu akan menggunakanLOAD_FAST
- dan Anda dapatkan*UnboundLocalError: local variable 'l' referenced before assignment*
sumber
Anda dapat membuat panggilan fungsi, tetapi Anda tidak dapat + = melakukan panggilan fungsi secara langsung:
sumber
Saya akan mengatakan bahwa ada beberapa perbedaan ketika datang dengan numpy (saya hanya melihat bahwa pertanyaannya bertanya tentang menggabungkan dua daftar, bukan array numpy, tetapi karena mungkin menjadi masalah bagi pemula, seperti saya, saya harap ini dapat membantu seseorang yang mencari solusi untuk posting ini), mis.
itu akan kembali dengan kesalahan
ValueError: operan tidak dapat disiarkan bersama dengan bentuk (0,) (4,4,4)
b.extend(a)
bekerja dengan sempurnasumber
Dari kode sumber CPython 3.5.2 : Tidak ada perbedaan besar.
sumber
memperpanjang () bekerja dengan iterable *, + = bekerja dengan beberapa tetapi bisa menjadi funky.
Python 3.6
* cukup yakin .extend () berfungsi dengan iterable tapi tolong beri komentar jika saya salah
sumber
list.extend(iterable) Extend the list by appending all the items from the iterable. Equivalent to a[len(a):] = iterable.
Tebak saya menjawab tanda bintang saya sendiri.+=
operator dengan objek dari tipe yang berbeda (bertentangan dengan dua daftar, seperti dalam pertanyaan), Anda tidak bisa berharap bahwa Anda akan mendapatkan gabungan dari objek. Dan Anda tidak dapat berharap bahwa akan adalist
jenis yang dikembalikan. Lihatlah kode Anda, Anda mendapatkannumpy.ndarray
alih - alihlist
.Sebenarnya, ada perbedaan antara tiga pilihan:
ADD
,INPLACE_ADD
danextend
. Yang pertama selalu lebih lambat, sementara dua lainnya kira-kira sama.Dengan informasi ini, saya lebih suka menggunakan
extend
, yang lebih cepat daripadaADD
, dan menurut saya lebih eksplisit dari apa yang Anda lakukan daripadaINPLACE_ADD
.Coba kode berikut beberapa kali (untuk Python 3):
sumber
ADD
denganINPLACE_ADD
danextend()
.ADD
menghasilkan daftar baru dan menyalin elemen dari dua daftar asli ke dalamnya. Pasti itu akan lebih lambat daripada operasi inplace dariINPLACE_ADD
danextend()
.Informasi ini kebetulan terkubur di FAQ Pemrograman :
Anda juga dapat melihatnya sendiri dalam kode sumber CPython: https://github.com/python/cpython/blob/v3.8.2/Objects/listobject.c#L1000-L1011
sumber
Menurut Python untuk Analisis Data.
“Perhatikan bahwa daftar gabungan dengan penambahan adalah operasi yang relatif mahal karena daftar baru harus dibuat dan objek disalin. Menggunakan perluasan untuk menambahkan elemen ke daftar yang ada, terutama jika Anda membangun daftar besar, biasanya lebih disukai. " Jadi,
lebih cepat daripada alternatif ratenatif:
sumber
everything = everything + temp
tidak harus diimplementasikan dengan cara yang sama sepertieverything += temp
.everything += temp
diimplementasikan sedemikian rupa sehinggaeverything
tidak perlu disalin. Ini cukup banyak membuat jawaban Anda menjadi titik perdebatan.