Dengan Python, di mana dan kapan menggunakan penggabungan string versus substitusi string tidak dapat saya lakukan. Karena penggabungan string telah melihat peningkatan besar dalam kinerja, apakah ini (menjadi lebih) keputusan gaya daripada yang praktis?
Untuk contoh konkret, bagaimana seharusnya seseorang menangani konstruksi URI fleksibel:
DOMAIN = 'http://stackoverflow.com'
QUESTIONS = '/questions'
def so_question_uri_sub(q_num):
return "%s%s/%d" % (DOMAIN, QUESTIONS, q_num)
def so_question_uri_cat(q_num):
return DOMAIN + QUESTIONS + '/' + str(q_num)
Sunting: Ada juga saran tentang bergabung dengan daftar string dan untuk menggunakan substitusi bernama. Ini adalah varian dari tema sentral, yaitu, pada saat mana Cara Benar melakukannya? Terima kasih atas tanggapannya!
python
string
string-concatenation
Gotgenes
sumber
sumber
Jawaban:
Penggabungan (secara signifikan) lebih cepat menurut mesin saya. Tetapi secara gaya, saya bersedia membayar harga penggantian jika kinerja tidak kritis. Nah, dan jika saya perlu pemformatan, tidak perlu mengajukan pertanyaan ... tidak ada pilihan selain menggunakan interpolasi / templating.
sumber
Jangan lupa tentang substitusi bernama:
sumber
Berhati-hatilah saat menggabungkan string dalam satu lingkaran! Biaya penggabungan string sebanding dengan panjang hasil. Pendauran membawa Anda langsung ke tanah N-kuadrat. Beberapa bahasa akan mengoptimalkan penggabungan ke string yang paling baru dialokasikan, tetapi berisiko mengandalkan kompiler untuk mengoptimalkan algoritme kuadrat Anda hingga linier. Paling baik menggunakan primitif (
join
?) Yang mengambil seluruh daftar string, melakukan alokasi tunggal, dan menggabungkan semuanya sekaligus.sumber
"Karena penggabungan string telah melihat peningkatan besar dalam performa ..."
Jika kinerja itu penting, ini bagus untuk diketahui.
Namun, masalah kinerja yang pernah saya lihat tidak pernah turun ke operasi string. Saya biasanya mendapat masalah dengan I / O, pengurutan dan operasi O ( n 2 ) menjadi hambatan.
Sampai operasi string menjadi pembatas kinerja, saya akan tetap menggunakan hal-hal yang sudah jelas. Sebagian besar, itu adalah substitusi ketika itu satu baris atau kurang, penggabungan ketika masuk akal, dan alat templat (seperti Mako) ketika itu besar.
sumber
Apa yang ingin Anda gabungkan / interpolasi dan bagaimana Anda ingin memformat hasilnya harus mendorong keputusan Anda.
Interpolasi string memungkinkan Anda menambahkan pemformatan dengan mudah. Nyatanya, versi interpolasi string Anda tidak melakukan hal yang sama seperti versi penggabungan Anda; itu sebenarnya menambahkan garis miring ke depan ekstra sebelum
q_num
parameter. Untuk melakukan hal yang sama, Anda harus menulisreturn DOMAIN + QUESTIONS + "/" + str(q_num)
di contoh itu.Interpolasi memudahkan untuk memformat angka;
"%d of %d (%2.2f%%)" % (current, total, total/current)
akan jauh lebih sulit dibaca dalam bentuk rangkaian.Penggabungan berguna saat Anda tidak memiliki jumlah item tetap untuk dijadikan string.
Juga, ketahuilah bahwa Python 2.6 memperkenalkan versi baru dari interpolasi string, yang disebut template string :
String templating dijadwalkan untuk menggantikan% -interpolation, tapi itu tidak akan terjadi untuk waktu yang cukup lama, saya kira.
sumber
Saya baru saja menguji kecepatan metode penggabungan / substitusi string yang berbeda karena penasaran. Pencarian google tentang subjek membawa saya ke sini. Saya pikir saya akan memposting hasil tes saya dengan harapan dapat membantu seseorang memutuskan.
... Setelah berjalan
runtests((percent_, format_, format2_, concat_), runs=5)
, saya menemukan bahwa% metode sekitar dua kali lebih cepat dari yang lain pada string kecil ini. Metode concat selalu yang paling lambat (hampir tidak). Ada perbedaan yang sangat kecil saat mengganti posisi dalamformat()
metode ini, tetapi posisi peralihan selalu setidaknya 0,01 lebih lambat daripada metode format biasa.Contoh hasil tes:
Saya menjalankan ini karena saya menggunakan rangkaian string dalam skrip saya, dan saya bertanya-tanya berapa biayanya. Saya menjalankannya dalam urutan berbeda untuk memastikan tidak ada yang mengganggu, atau mendapatkan kinerja yang lebih baik menjadi yang pertama atau terakhir. Di samping catatan, saya memasukkan beberapa generator string yang lebih panjang ke dalam fungsi-fungsi seperti
"%s" + ("a" * 1024)
dan concat biasa hampir 3 kali lebih cepat (1.1 vs 2.8) daripada menggunakan metodeformat
dan%
. Saya kira itu tergantung pada senar, dan apa yang ingin Anda capai. Jika kinerja benar-benar penting, mungkin lebih baik mencoba berbagai hal dan mengujinya. Saya cenderung memilih keterbacaan daripada kecepatan, kecuali kecepatan menjadi masalah, tapi itu hanya saya. JADI tidak suka salin / tempel saya, saya harus meletakkan 8 spasi pada semuanya agar terlihat benar. Saya biasanya menggunakan 4.sumber
str.format()
danstr.join()
lebih dari penggabungan normal. Saya juga mengawasi 'f-string' dari PEP 498 , yang baru-baru ini diterima. Adapunstr()
panggilan yang memengaruhi kinerja, saya yakin Anda benar tentang itu. Saya tidak tahu betapa mahalnya panggilan fungsi pada saat itu. Saya masih berpikir bahwa tes harus dilakukan jika ada keraguan.join_(): return ''.join(["test ", str(1), ", with number ", str(2)])
, tampaknyajoin
juga lebih lambat dari persentase.Ingat, keputusan gaya adalah keputusan praktis, jika Anda berencana untuk mempertahankan atau men-debug kode Anda :-) Ada kutipan terkenal dari Knuth (mungkin mengutip Hoare?): "Kita harus melupakan tentang efisiensi kecil, katakan sekitar 97% dari waktu: pengoptimalan prematur adalah akar dari segala kejahatan. "
Selama Anda berhati-hati untuk tidak (mengatakan) mengubah tugas O (n) menjadi tugas O (n 2 ), saya akan memilih mana pun yang menurut Anda paling mudah dipahami ..
sumber
Saya menggunakan substitusi di mana pun saya bisa. Saya hanya menggunakan penggabungan jika saya sedang membangun string di katakanlah for-loop.
sumber
Sebenarnya hal yang benar untuk dilakukan, dalam hal ini (jalur pembangunan) adalah menggunakan
os.path.join
. Bukan penggabungan string atau interpolasisumber