2016-01-05 22 views
9

Nesne kimliği almak için bazı isteklerde bulunduğum bir uygulama geliştiriyorum. Her birinin ardından, bu kimliği bir argüman olarak ileten bir yöntem (get_actor_info()) çağırıyorum (aşağıdaki kod).Python dize biçimlendirmesi:% vs concatenation

ACTOR_CACHE_KEY_PREFIX = 'actor_' 

def get_actor_info(actor_id): 
    cache_key = ACTOR_CACHE_KEY_PREFIX + str(actor_id) 

olarak, actor_idstring için döküm ve bir önek ile ardarda eklemek ediyorum fark edilebilir. Bununla birlikte, bunu diğer birçok yolla yapabileceğimi biliyorum (örneğin, .format() veya '%s%d') ve bu benim soruyla sonuçlanıyor: '%s%d' okunabilirlik, kod kuralları ve verimlilik açısından dize birleştirme işleminden daha iyi olur mu? o performansa gelince

Teşekkür

+0

Kendiniz kontrol edebilirsiniz: https://docs.python.org/2/library/timeit.html –

+1

Teşekkürler @brunodesthuilliers! Bununla birlikte, bu, sorunun yalnızca zaman verimliliği kısmını cevaplar. –

+2

Evet özür dilerim ... wrt/okunabilirlik ve kurallar, cevap basittir: '.format()' kullanın. –

cevap

9

Bu, fikir tabanlı bir iş parçacığı haline gelebilir, ancak biçimlendirmenin çoğu durumda daha okunabilir ve daha fazla kullanılabilir olmasını sağlarım. Son dizgenin neye benzeyeceğini "zihinsel birleştirme" yapmadan görselleştirmek daha kolaydır. Bunlardan hangisi daha okunabilir, örneğin?

errorString = "Exception occurred ({}) while executing '{}': {}".format(
    e.__class__.__name__, task.name, str(e) 
) 

Veya:

errorString = "Exception occurred (" + e.__class__.__name__ 
    + ") while executing '" + task.name + "': " + str(e) 

% veya .format() kullanılıp kullanılmayacağını gelince, ben daha objektif yanıtlayabilir: Kullanım .format(). % yakında kaldırılmış olabilir Python Documentation başına, "eski stil", ve: str.format() yana

oldukça yeni, Python kodu hala bir sürü % operatörünü kullanır. Ancak, bu eski biçimlendirme stili sonunda dilden kaldırılacağından, genellikle str.format() kullanılmalıdır. Belgelerin

Sonraki sürümlerinde bu söz durmuş, ama yine de .format() geleceğin yoludur; kullan onu! Birleştirme daha hızlıdır, ancak bu bir sorun olmamalıdır. Kodunuzu ilk satır hedefi olarak okunabilir ve sürdürülebilir yapın ve daha sonra optimize etmek için ihtiyaç duyduğunuz parçaları optimize edin.

ACTOR_CACHE_KEY_PREFIX = 'actor_' 

def get_actor_info(actor_id): 
    cache_key = f'{ACTOR_CACHE_KEY_PREFIX}{actor_id}' 

Performans '{}{}'.format(ACTOR_CACHE_KEY_PREFIX, actor_id) karşılaştırılabilir olmalı, ama belki daha okunabilir:

4

Birleştirme iyidir. Örneğinizde, hem birleştirme hem de yer değiştirme okunabilir, ancak daha karmaşık şablonlar söz konusu olduğunda, ikame basitlik ve okunabilirlik yarışını kazanır.

Örneğin, verileriniz varsa ve bunu html olarak göstermek istiyorsanız, birleştirme işlemi baş ağrısına neden olurken, ikame işlemi basit ve okunabilir olur.

+0

Birleştirme * performans söz konusu olduğunda * daha kötüsüdür *. Https: // waymoot sayfasına bakın.org/home/python_string/ve http://leadsift.com/python-string-concatenation/ – jalanb

2

Python 3.6 henüz başka seçeneği tanıtacak); Erken optimizasyon tüm kötülüklerin köküdür.