2010-02-06 17 views
8

Bilgisayar bilimlerinde bir geleceğe hazırlanmaya çalışıyorum, bu yüzden ECMAScript ile başladım ve şimdi Python hakkında daha fazla şey öğrenmeye çalışıyorum. ECMAScript'ten gelen gibi, a, b, c = 1, 2, 3 gibi birden fazla ödevin görülmesi, birden fazla ödevin devam ettiğini fark edinceye kadar, bir an için beni şaşkın bırakıyor. İşleri biraz daha net hale getirmek için, (a, b, c) = (1, 2, 3) yapmayı gerçekten çok isterim ancak bunun ölçülebilir bir performans isabeti olup olmayacağından emin değilim. Anladığım kadarıyla, tupeler esasen birden fazla ödevin ne kadar işe yaradığıdır, ancak dünyada çok fazla tuhaflık var, bu yüzden hiçbir şey almamayı deniyorum.Python'da Çoklu Atama Yöntemi

Şimdiden teşekkürler

+6

İşte bilgisayar bilimlerinde geleceğiniz için bir ipucu (30 + yıldır işteyim). ** Bu çoklu optimizasyon ifadesinin programınızı kesinlikle öldürdüğünü ** kanıtlayabilene kadar, bu tür bir optimizasyon sorusuna zaman harcamayın. Bir şeyin kanıtlanamayacak kadar yavaş olduğunu ** kanıtlayana kadar, onu kullan. Performans hakkında endişelenmeden her şeyi kullanın. Dili icat eden milletler bunun için çoktan endişeleniyorlar. –

cevap

11

Performans üzerinde herhangi bir etkisi olmamalıdır. Parantez bunu bir tuple yapmaz, virgülün yaptığı şeydir. Yani (1,2,3) tam olarak benim bildiğim kadarıyla tuple packing ve tanımlama grubu veri açma kombinasyonu olarak uygulanır 1,2,3

+0

Ah ... Bunu düşünmedim bile. Teşekkürler. – Reid

1

Çoklu atama aynıdır, bu nedenle aynı etkiye sahip olmalıdır.

2

Ayrıca listeler için geçerlidir: dis modülü ile sadece de

+1

Ve python'da "paketini açma" olarak adlandırıldı –

13

Bu kontrol etmek son derece kolaydır

a, b, c = [1, 2, 3] 

eserler:

>>> import dis 
>>> dis.dis(compile('a,b,c=1,2,3','','exec')) 
    1   0 LOAD_CONST    4 ((1, 2, 3)) 
       3 UNPACK_SEQUENCE   3 
       6 STORE_NAME    0 (a) 
       9 STORE_NAME    1 (b) 
      12 STORE_NAME    2 (c) 
      15 LOAD_CONST    3 (None) 
      18 RETURN_VALUE   
>>> dis.dis(compile('(a,b,c)=(1,2,3)','','exec')) 
    1   0 LOAD_CONST    4 ((1, 2, 3)) 
       3 UNPACK_SEQUENCE   3 
       6 STORE_NAME    0 (a) 
       9 STORE_NAME    1 (b) 
      12 STORE_NAME    2 (c) 
      15 LOAD_CONST    3 (None) 
      18 RETURN_VALUE   
>>> 

görüyor musunuz? Bunlar tamamen gereksiz parantez kesinlikle oluşturulan ve yürütüldüğünde baytkoduna hiçbir fark - sadece diyelim ki a+b ve (a+b) üretmek ve birbirlerine tam olarak aynı bayt kodu çalıştırır, gibi. Dolayısıyla, parantezleri fazladan parantez eklemek istiyorsanız, kendinizi yıkın - kodunuzu okuyan insanlar bunlardan hoşlanmayabilir, ancak bunu yürüten kişiler asla farkına bile varmayacaktır. Sadece, neden iki çift gereksiz parantezde dursun? Ayrı ayrı parantezin altı çifti (veya herhangi bir sayı, gerçekten) yine de tam olarak aynı kodu üretmektedir. Bkz.

>>> dis.dis(compile('(((a,b,c)))=(((1,2,3)))','','exec')) 
    1   0 LOAD_CONST    4 ((1, 2, 3)) 
       3 UNPACK_SEQUENCE   3 
       6 STORE_NAME    0 (a) 
       9 STORE_NAME    1 (b) 
      12 STORE_NAME    2 (c) 
      15 LOAD_CONST    3 (None) 
      18 RETURN_VALUE   
>>> 
. Bir kez daha fazla parantezin bariz minimum sayısını (hiç yok: onlar gereksiz, her şeyden önce ;-), tam olarak nerede durdurmak mı? -) Ve neden orada, henüz bir daha eklemek için "ücretsiz" çift ​​... ya da iki ... ya da ...? -)