Apakah ada beberapa kelas string dalam Python seperti StringBuilderdi C #?
Apakah ada beberapa kelas string dalam Python seperti StringBuilderdi C #?
Jawaban:
Tidak ada korelasi satu-ke-satu. Untuk artikel yang sangat bagus, silakan lihat Penggabungan String yang Efisien dengan Python :
Membangun string panjang dalam bahasa pemrograman Python terkadang dapat menghasilkan kode yang berjalan sangat lambat. Pada artikel ini saya menyelidiki kinerja komputasi berbagai metode penggabungan string.
Saya telah menggunakan kode Oliver Crow (tautan yang diberikan oleh Andrew Hare) dan sedikit mengadaptasinya untuk menyesuaikan Python 2.7.3. (dengan menggunakan paket timeit). Saya menjalankan komputer pribadi saya, Lenovo T61, RAM 6GB, Debian GNU / Linux 6.0.6 (pemerasan).
Berikut hasil untuk 10.000 iterasi:
metode1: 0,0538418292999 dtk ukuran proses 4800 kb metode2: 0,22602891922 dtk ukuran proses 4960 kb method3: 0,0605459213257 detik ukuran proses 4980 kb method4: 0,0544030666351 detik ukuran proses 5536 kb metode5: 0,0551080703735 detik ukuran proses 5272 kb method6: 0,0542731285095 detik ukuran proses 5512 kb
dan untuk 5.000.000 iterasi (metode 2 diabaikan karena berjalan terlalu lambat, seperti selamanya):
method1: 5.88603997231 detik ukuran proses 37976 kb method3: 8.40748500824 detik ukuran proses 38024 kb method4: 7.96380496025 detik ukuran proses 321968 kb method5: 8.03666186333 detik ukuran proses 71720 kb method6: 6.68192911148 detik ukuran proses 38240 kb
Sangat jelas bahwa orang-orang Python telah melakukan pekerjaan yang cukup bagus untuk mengoptimalkan penggabungan string, dan seperti yang dikatakan Hoare: "pengoptimalan prematur adalah akar dari semua kejahatan" :-)
Mengandalkan pengoptimalan kompiler itu rapuh. Tolok ukur yang ditautkan dalam jawaban yang diterima dan angka yang diberikan oleh Antoine-tran tidak bisa dipercaya. Andrew Hare membuat kesalahan dengan memasukkan panggilan ke reprdalam metodenya. Itu memperlambat semua metode secara sama tetapi mengaburkan penalti sebenarnya dalam membangun string.
Gunakan join. Ini sangat cepat dan lebih kuat.
$ ipython3
Python 3.5.1 (default, Mar 2 2016, 03:38:02)
IPython 4.1.2 -- An enhanced Interactive Python.
In [1]: values = [str(num) for num in range(int(1e3))]
In [2]: %%timeit
...: ''.join(values)
...:
100000 loops, best of 3: 7.37 µs per loop
In [3]: %%timeit
...: result = ''
...: for value in values:
...: result += value
...:
10000 loops, best of 3: 82.8 µs per loop
In [4]: import io
In [5]: %%timeit
...: writer = io.StringIO()
...: for value in values:
...: writer.write(value)
...: writer.getvalue()
...:
10000 loops, best of 3: 81.8 µs per loop
reprpanggilan mendominasi waktu proses, tetapi Anda tidak perlu membuat kesalahan menjadi pribadi.
Python memiliki beberapa hal yang memenuhi tujuan serupa:
list(your_string). Anda juga bisa menggunakan a UserString.MutableStringuntuk ini.(c)StringIO.StringIO berguna untuk hal-hal yang seharusnya mengambil file, tetapi kurang berguna untuk pembuatan string umum.Dengan menggunakan metode 5 dari atas (The Pseudo File) kita bisa mendapatkan kinerja dan fleksibilitas yang sangat baik
from cStringIO import StringIO
class StringBuilder:
_file_str = None
def __init__(self):
self._file_str = StringIO()
def Append(self, str):
self._file_str.write(str)
def __str__(self):
return self._file_str.getvalue()
sekarang menggunakannya
sb = StringBuilder()
sb.Append("Hello\n")
sb.Append("World")
print sb
Tidak ada analog eksplisit - saya pikir Anda diharapkan menggunakan rangkaian string (kemungkinan dioptimalkan seperti yang dikatakan sebelumnya) atau kelas pihak ketiga (saya ragu mereka jauh lebih efisien - daftar di python diketik dinamis jadi tidak bekerja cepat char [] untuk buffer seperti yang saya asumsikan). Kelas seperti pembuat string bukanlah pengoptimalan prematur karena fitur bawaan string dalam banyak bahasa (kekekalan) - yang memungkinkan banyak pengoptimalan (misalnya, merujuk buffer yang sama untuk irisan / substring). Kelas Stringbuilder / stringbuffer / seperti stringstream bekerja jauh lebih cepat daripada string gabungan (menghasilkan banyak objek sementara kecil yang masih membutuhkan alokasi dan pengumpulan sampah) dan bahkan alat pemformatan string seperti printf, tidak perlu menafsirkan overhead pola pemformatan yang cukup memakan waktu banyak panggilan format.
Jika Anda di sini mencari metode penggabungan string cepat dengan Python, maka Anda tidak memerlukan kelas StringBuilder khusus. Rangkaian sederhana bekerja dengan baik tanpa penalti kinerja yang terlihat di C #.
resultString = ""
resultString += "Append 1"
resultString += "Append 2"
Lihat jawaban Antoine-tran untuk hasil kinerja