2010-02-06 3 views
8

Próbuję przygotować się do przyszłości w informatyce, więc zacząłem od ECMAScript i teraz próbuję dowiedzieć się więcej o Pythonie. Wychodząc z ECMAScript, zobaczenie wielu zadań, takich jak a, b, c = 1, 2, 3, pozostawia mnie na chwilę oszołomioną, dopóki nie zorientuję się, że dzieje się wiele zadań. Aby było to nieco bardziej zrozumiałe, naprawdę chciałbym zrobić (a, b, c) = (1, 2, 3), ale nie jestem pewien, czy będzie to wymierne uderzenie wydajności. Z tego co rozumiem, krotki są zasadniczo tym, jak wiele zadań działa niezależnie, ale jest wiele niesamowitych rzeczy na świecie, więc staram się niczego nie zakładać.Metoda wielokrotnego przypisywania w Pythonie

Z góry dziękuję

+6

Oto wskazówka dla twojej przyszłości w informatyce (jestem w branży od ponad 30 lat). Nie trać czasu na tego rodzaju pytanie optymalizacyjne, dopóki ** nie udowodnisz, że oświadczenie o wielu zadaniach absolutnie zabiło twój program. Dopóki nie masz ** dowodu **, że coś jest niedopuszczalnie wolne, użyj go. Używaj wszystkiego, nie martwiąc się o wydajność. Ludzie, którzy wymyślili język, martwili się już o ciebie. –

Odpowiedz

11

Nie powinno to mieć żadnego wpływu na wydajność. W nawiasie nie jest to krotka, przecinek. Więc (1,2,3) jest dokładnie taki sam jak 1,2,3

+0

Ah ... Nawet o tym nie pomyślałem. Dzięki. – Reid

1

Wiele zadań jest zaimplementowanych jako połączenie pakowania krotek i rozpakowywania krotek, według mojej wiedzy, więc powinien mieć taki sam efekt.

2

Działa również na listach:

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

działa tak samo dobrze

+1

I to się nazywa "rozpakowywanie" w python –

13

Jest to niezwykle łatwe do sprawdzenia, z modułem dis:

>>> 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   
>>> 

zobaczyć? Te całkowicie nadmiarowe nawiasy powodują całkowitą różnicę w stosunku do kodu bajtowego, który jest generowany i wykonywany - tak jak, powiedzmy, a+b i (a+b) wygeneruje i wykona dokładnie ten sam kod bajtowy, co każdy inny. Jeśli więc chcesz dodać nadmiarowe nawiasy, zrób sobie przerwę - ludzie, którzy czytają twój kod, mogą ich nie lubić, ale ci, którzy dopiero je wykonują, nigdy nie zauważą. Tylko dlaczego warto zatrzymać się na dwóch parach zbędnych nawiasów? Zobacz,

>>> 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   
>>> 

sześć par zbędnych nawiasów (lub dowolnej liczbie, naprawdę) nadal produkować dokładnie ten sam kod. Po opuszczeniu oczywistej minimalnej liczby zbędnych nawiasów (wcale: w końcu są zbędne ;-), dokładnie , gdzie przestajesz? -) I dlaczego, kiedy jest "wolny", aby dodać jeszcze jeden parę ... lub dwie ... lub trzy ...? -)