Cara Menambah Satu Rentetan dengan Rentetan yang Lain dengan Cekap dalam Python
Dalam Python, menggabungkan rentetan dengan operator ' ' ialah tugas biasa. Walaupun kod berikut adalah mudah:
<code class="python">var1 = "foo" var2 = "bar" var3 = var1 + var2</code>
Ia menimbulkan persoalan tentang kecekapan, terutamanya untuk rentetan besar atau gabungan berulang.
Pelanjutan Rentetan Dalam Tempat
Nasib baik, CPython telah melaksanakan pengoptimuman untuk meningkatkan kecekapan penyambungan rentetan. Apabila hanya satu rujukan kepada rentetan wujud dan rentetan lain dilampirkan padanya, CPython cuba memanjangkan rentetan asal di tempatnya. Pengoptimuman ini menjadikan operasi dilunaskan O(n).
Sebagai contoh, kod berikut pernah menjadi O(n^2):
<code class="python">s = "" for i in range(n): s += str(i)</code>
Walau bagaimanapun, dengan pengoptimuman, ia kini berjalan dalam O(n).
Butiran Pelaksanaan Python
Berikut ialah petikan daripada kod sumber Python C yang menggambarkan pengoptimuman:
<code class="c">int _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize) { /* ... */ *pv = (PyObject *) PyObject_REALLOC((char *)v, PyBytesObject_SIZE + newsize); if (*pv == NULL) { PyObject_Del(v); PyErr_NoMemory(); return -1; } _Py_NewReference(*pv); sv = (PyBytesObject *) *pv; Py_SIZE(sv) = newsize; sv->ob_sval[newsize] = '<pre class="brush:php;toolbar:false"><code class="python">import timeit s = "" for i in range(10): s += 'a' # Time the concatenation of 10 'a' characters t1 = timeit.timeit(stmt="""s = "" for i in range(10): s += 'a'""", globals=globals(), number=1000000) # Time the concatenation of 100 'a' characters t2 = timeit.timeit(stmt="""s = "" for i in range(100): s += 'a'""", globals=globals(), number=100000) # Time the concatenation of 1000 'a' characters t3 = timeit.timeit(stmt="""s = "" for i in range(1000): s += 'a'""", globals=globals(), number=10000) print("10 'a':", t1) print("100 'a':", t2) print("1000 'a':", t3)</code>
Fungsi ini membenarkan saiz semula objek rentetan, tetapi hanya jika terdapat hanya satu rujukan kepadanya. Saiz rentetan ditukar sambil mengekalkan lokasi memori asal.
Awas
Adalah penting untuk ambil perhatian bahawa pengoptimuman ini bukan sebahagian daripada spesifikasi Python. Ia hanya dilaksanakan dalam penterjemah CPython. Pelaksanaan Python lain, seperti PyPy atau Jython, mungkin mempamerkan ciri prestasi yang berbeza.
Ujian Empirikal
Secara empirik, pengoptimuman terbukti dalam prestasi kod berikut:
Hasilnya menunjukkan peningkatan ketara dalam masa pelaksanaan apabila bilangan penggabungan bertambah, menunjukkan bahawa pengoptimuman tidak boleh digunakan untuk rentetan yang lebih besar.
Kesimpulan
Walaupun pengoptimuman sambungan rentetan di tempat Python secara mendadak meningkatkan kecekapan penggabungan rentetan dalam senario tertentu, adalah penting untuk memahami batasan pelaksanaan ini. Untuk rentetan besar atau apabila pertimbangan pengurusan ingatan adalah yang utama, kaedah alternatif manipulasi rentetan mungkin diperlukan untuk mencapai prestasi optimum.
Atas ialah kandungan terperinci Adakah pengoptimuman penggabungan rentetan Python digunakan pada rentetan besar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!