Karena Python string
tidak dapat diubah, saya bertanya-tanya bagaimana cara menggabungkan string yang lebih efisien?
Saya bisa menulis seperti itu:
s += stringfromelsewhere
atau seperti ini:
s = []
s.append(somestring)
later
s = ''.join(s)
Saat menulis pertanyaan ini, saya menemukan artikel yang bagus berbicara tentang topik tersebut.
http://www.skymind.com/~ocrow/python_string/
Tapi itu di Python 2.x., jadi pertanyaannya adalah apakah ada perubahan di Python 3?
python
string
python-3.x
concat
Maks
sumber
sumber
Jawaban:
Cara terbaik menambahkan string ke variabel string adalah dengan menggunakan
+
atau+=
. Ini karena mudah dibaca dan cepat. Mereka juga sama cepatnya, yang mana yang Anda pilih adalah masalah selera, yang terakhir adalah yang paling umum. Berikut adalah pengaturan waktu dengantimeit
modul:Namun, mereka yang merekomendasikan memiliki daftar dan menambahkannya kemudian bergabung dengan daftar itu, melakukannya karena menambahkan string ke daftar mungkin sangat cepat dibandingkan dengan memperpanjang string. Dan ini bisa benar, dalam beberapa kasus. Di sini, misalnya, adalah satu juta penambahan string satu karakter, pertama ke string, lalu ke daftar:
OK, ternyata bahkan ketika string yang dihasilkan adalah sejuta karakter, menambahkan masih lebih cepat.
Sekarang mari kita coba dengan menambahkan string panjang karakter seribu seratus ribu kali:
Oleh karena itu, string akhir memiliki panjang sekitar 100MB. Itu sangat lambat, menambahkan daftar jauh lebih cepat. Bahwa waktu itu tidak termasuk final
a.join()
. Jadi berapa lama?Oups Ternyata bahkan dalam kasus ini, tambahkan / gabung lebih lambat.
Jadi dari mana datangnya rekomendasi ini? Python 2?
Nah, tambahkan / gabungkan sedikit lebih cepat di sana jika Anda menggunakan string yang sangat panjang (yang biasanya tidak Anda miliki, apa yang akan Anda miliki string yang 100 MB dalam memori?)
Tetapi penentu nyata adalah Python 2.3. Di mana saya bahkan tidak akan menunjukkan waktu kepada Anda, karena itu sangat lambat sehingga belum selesai. Tes-tes ini tiba-tiba memakan waktu beberapa menit . Kecuali untuk append / join, yang sama cepatnya dengan Python berikutnya.
Ya. Rangkaian string sangat lambat di Python kembali di zaman batu. Tetapi pada 2.4 itu tidak lagi (atau setidaknya Python 2.4.7), jadi rekomendasi untuk menggunakan append / join menjadi usang pada 2008, ketika Python 2.3 berhenti diperbarui, dan Anda seharusnya berhenti menggunakannya. :-)
(Pembaruan: Ternyata ketika saya melakukan pengujian lebih hati-hati yang menggunakan
+
dan+=
lebih cepat untuk dua string pada Python 2.3 juga. Rekomendasi untuk menggunakan''.join()
harus kesalahpahaman)Namun, ini adalah CPython. Implementasi lain mungkin memiliki masalah lain. Dan ini hanyalah alasan lain mengapa optimasi prematur adalah akar dari semua kejahatan. Jangan gunakan teknik yang seharusnya "lebih cepat" kecuali Anda mengukurnya terlebih dahulu.
Oleh karena itu versi "terbaik" untuk melakukan penggabungan string adalah dengan menggunakan + atau + = . Dan jika itu ternyata lambat bagi Anda, yang sangat tidak mungkin, maka lakukan sesuatu yang lain.
Jadi mengapa saya menggunakan banyak append / join di kode saya? Karena terkadang itu sebenarnya lebih jelas. Terutama ketika apa pun yang Anda harus menyatukan bersama harus dipisahkan oleh spasi atau koma atau baris baru.
sumber
Jika Anda menggabungkan banyak nilai, maka keduanya juga tidak. Menambahkan daftar itu mahal. Anda dapat menggunakan StringIO untuk itu. Terutama jika Anda membangunnya di banyak operasi.
Jika Anda sudah memiliki daftar lengkap yang dikembalikan kepada Anda dari beberapa operasi lain, maka cukup gunakan
''.join(aList)
Dari python FAQ: Apa cara paling efisien untuk menggabungkan banyak string bersama?
Sunting: Saya bodoh dan hasilnya disisipkan mundur, membuatnya tampak seperti menambahkan daftar lebih cepat daripada cStringIO. Saya juga telah menambahkan tes untuk concat bytearray / str, serta tes putaran kedua menggunakan daftar yang lebih besar dengan string yang lebih besar. (python 2.7.3)
contoh uji ipython untuk daftar string yang besar
sumber
cStringIO
tidak ada di Py3. Gunakanio.StringIO
sebagai gantinya.Dalam Python> = 3.6, f-string baru adalah cara yang efisien untuk menggabungkan string.
sumber
Metode yang disarankan masih menggunakan append dan gabung.
sumber
Jika string yang Anda gabungkan adalah literal, gunakan string literal string
Ini berguna jika Anda ingin mengomentari sebagian string (seperti di atas) atau jika Anda ingin menggunakan string mentah atau tiga kutipan untuk bagian literal tetapi tidak semua.
Karena ini terjadi pada lapisan sintaks menggunakan operator concatenation nol.
sumber
Anda menulis fungsi ini
Maka Anda dapat menelepon ke mana saja Anda inginkan
sumber
str_join = lambda *str_list: ''.join(s for s in str_list)
Menggunakan penggabungan string di tempat dengan '+' adalah metode penggabungan THE WORST dalam hal stabilitas dan implementasi lintas karena tidak mendukung semua nilai. Standar PEP8 tidak mendukung hal ini dan mendorong penggunaan format (), join () dan append () untuk penggunaan jangka panjang.
Seperti dikutip dari bagian "Rekomendasi Pemrograman" yang ditautkan:
sumber
Sementara agak tanggal, Kode Seperti Pythonista: idiomatic Python merekomendasikan
join()
lebih+
di bagian ini . Seperti halnya PythonSpeedPerformanceTips di bagiannya pada string concatenation , dengan penafian berikut:sumber
Seperti @jdi menyebutkan dokumentasi Python menyarankan untuk menggunakan
str.join
atauio.StringIO
untuk penggabungan string. Dan mengatakan bahwa pengembang harus mengharapkan waktu kuadrat dari+=
dalam satu lingkaran, meskipun ada optimasi sejak Python 2.4. Seperti jawaban ini mengatakan:Saya akan menunjukkan contoh kode dunia nyata yang secara naif mengandalkan
+=
optimasi ini, tetapi tidak berlaku. Kode di bawah ini mengubah iterable string pendek menjadi potongan yang lebih besar untuk digunakan dalam API massal.Kode ini dapat dijalankan selama berjam-jam karena kompleksitas waktu kuadratik. Di bawah ini adalah alternatif dengan struktur data yang disarankan:
Dan tolok ukur mikro:
sumber
Anda dapat melakukannya dengan berbagai cara.
Saya membuat ringkasan kecil ini melalui artikel-artikel berikut.
sumber
kasing saya sedikit berbeda. Saya harus membuat kueri tempat lebih dari 20 bidang dinamis. Saya mengikuti pendekatan ini menggunakan metode format
ini relatif lebih mudah bagi saya daripada menggunakan + atau cara lain
sumber
Anda dapat menggunakan ini (lebih efisien) juga. ( /software/304445/why-is-s-better-than-for-concatenation )
sumber