كيفية إلحاق سلسلة واحدة بأخرى بكفاءة في بايثون
في بايثون، يعد ربط السلاسل مع عامل التشغيل ' ' مهمة شائعة. في حين أن الكود التالي واضح ومباشر:
var1 = "foo"
var2 = "bar"
var3 = var1 var2
إنه يثير تساؤلات حول الكفاءة، خاصة بالنسبة للسلاسل الكبيرة أو التسلسلات المتكررة.
امتداد السلسلة الموضعي
لحسن الحظ، CPython قام بتنفيذ تحسين لتحسين كفاءة تسلسل السلسلة. عند وجود مرجع واحد فقط لسلسلة ما وإلحاق سلسلة أخرى به، يحاول CPython تمديد السلسلة الأصلية في مكانها. يؤدي هذا التحسين إلى إطفاء العملية O(n).
على سبيل المثال، كان الكود التالي هو O(n^2):
s = ""
for i in range(n):
s = str(i)
ومع ذلك، مع التحسين، فإنه يعمل الآن في O(n).
تفاصيل تنفيذ بايثون
إليك مقتطف من كود مصدر Python 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] = '\0';
sv->ob_shash = -1; /* invalidate cached hash value */
return 0;
}
تسمح هذه الوظيفة بتغيير حجم كائن السلسلة، ولكن فقط إذا كان هناك مرجع واحد فقط له. يتم تغيير حجم السلسلة مع الحفاظ على موقع الذاكرة الأصلي.
تحذير
من المهم ملاحظة أن هذا التحسين ليس جزءًا من مواصفات Python. يتم تنفيذه فقط في مترجم CPython. قد تظهر تطبيقات Python الأخرى، مثل PyPy أو Jython، خصائص أداء مختلفة.
الاختبار التجريبي
من الناحية التجريبية، يكون التحسين واضحًا في أداء الكود التالي:
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)
تظهر النتائج زيادة كبيرة في وقت التنفيذ مع زيادة عدد التسلسلات، مما يشير إلى أن التحسين لا ينطبق على السلاسل الأكبر حجمًا.الاستنتاج
بينما يعمل تحسين امتداد السلسلة الموضعي في Python على تحسين كفاءة تسلسل السلسلة بشكل كبير في سيناريوهات معينة، من الضروري أن نفهم القيود المفروضة على هذا التنفيذ. بالنسبة للسلاسل الكبيرة أو عندما تكون اعتبارات إدارة الذاكرة ذات أهمية قصوى، قد تكون الطرق البديلة لمعالجة السلسلة ضرورية لتحقيق الأداء الأمثل.تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3