İyi bir dize değişkeni bir dize ekleyerek yolu kullanımı için +
ya +=
. Bunun nedeni, okunabilir ve hızlı olmasıdır. Aynı zamanda hızlıdırlar, seçtiğiniz bir tat meselesidir, ikincisi en yaygın olanıdır. timeit
Modül ile zamanlamalar şunlardır :
a = a + b:
0.11338996887207031
a += b:
0.11040496826171875
Ancak, listelere sahip olmayı ve bu listelere eklemeyi ve sonra bu listelere katılmayı önerenler bunu yapar, çünkü bir dizeye bir dize eklemek bir dizeyi genişletmeye kıyasla muhtemelen çok hızlıdır. Ve bu bazı durumlarda doğru olabilir. Örneğin, bir karakter dizesinin önce bir dizeye, sonra bir listeye bir milyon eklenmesi:
a += b:
0.10780501365661621
a.append(b):
0.1123361587524414
Tamam, ortaya çıkan dize bir milyon karakter uzunluğunda bile, eklemenin hala daha hızlı olduğu ortaya çıkıyor.
Şimdi bin karakter uzunluğunda bir dizeyi yüz bin kez eklemeyi deneyelim:
a += b:
0.41823482513427734
a.append(b):
0.010656118392944336
Bu nedenle, son dizgi yaklaşık 100 MB uzunluğunda olur. Bu oldukça yavaştı, bir listeye eklemek çok daha hızlıydı. Bu zamanlamanın finali içermemesi a.join()
. Peki bu ne kadar sürecek?
a.join(a):
0.43739795684814453
Oups. Bu durumda bile, ekleme / katılma daha yavaştır.
Peki bu öneri nereden geliyor? Python 2?
a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474
Son derece uzun dizeler kullanıyorsanız , ekleme / katılma biraz daha hızlıdır (genellikle değil, bellekte 100MB olan bir dizeye ne sahip olursunuz?)
Ancak gerçek kattığı Python 2.3. Zamanlamaları bile göstermeyeceğim yerde, çünkü henüz bitmediği için çok yavaş. Bu testler aniden dakikalar alır . Sonraki Python'lar kadar hızlı olan ekleme / katılma hariç.
Evet. İp çağında Python'da taş devri çok yavaştı. Ancak 2.4'te artık değil (veya en azından Python 2.4.7), bu nedenle ekleme / katılma kullanma önerisi Python 2.3'ün güncellenmesini bıraktığı 2008'de modası geçmiş ve onu kullanmayı bırakmış olmalısınız. :-)
(Güncelleme: Testi Python 2.3'te iki dizede kullanmanın +
ve +=
daha hızlı olduğunu daha dikkatli yaptığımda ortaya çıkıyor . Kullanım önerisi ''.join()
bir yanlış anlama olmalıdır)
Ancak, bu CPython. Diğer uygulamaların başka endişeleri de olabilir. Ve bu, erken optimizasyonun tüm kötülüğün kökü olmasının bir başka nedeni. İlk ölçmediğiniz sürece "daha hızlı" olduğu varsayılan bir tekniği kullanmayın.
Bu nedenle dize birleştirme yapmak için "en iyi" sürümü + veya + = kullanmaktır . Ve eğer bu sizin için yavaş görünüyorsa, bu pek olası değildir, o zaman başka bir şey yapın.
Peki neden koduma çok fazla ekleme / katılma kullanıyorum? Çünkü bazen aslında daha net. Özellikle bir araya getirmeniz gereken her şey boşluk, virgül veya satırsonu ile ayrılmalıdır.