Jakie są przesłanki leżące u podstaw zalecanego konstruowania pętli w stylu Python w stylu for i in xrange(...)
? W przypadku prostych pętli całkowitych różnica w kosztach ogólnych jest znaczna. Przeprowadziłem prosty test za pomocą dwóch kawałków kodu:Uzasadnienie preferowanego języka Pythona dla składni
plików idiomatic.py
:
#!/usr/bin/env python
M = 10000
N = 10000
if __name__ == "__main__":
x, y = 0, 0
for x in xrange(N):
for y in xrange(M):
pass
pliku cstyle.py
:
#!/usr/bin/env python
M = 10000
N = 10000
if __name__ == "__main__":
x, y = 0, 0
while x < N:
while y < M:
y += 1
x += 1
wyniki profilowania były następujące:
bash-3.1$ time python cstyle.py
real 0m0.109s
user 0m0.015s
sys 0m0.000s
bash-3.1$ time python idiomatic.py
real 0m4.492s
user 0m0.000s
sys 0m0.031s
mogę zrozum, dlaczego wersja Pythonic jest wolniejsza - wyobrażam to sobie ma wiele wspólnego z wywoływaniem xrange N razy, być może można to wyeliminować, gdyby istniał sposób na zwinięcie generatora. Jednak przy tej różnicy w czasie wykonywania, dlaczego wolelibyśmy używać wersji Pythonic?
Edit: przeprowadziłem testy ponownie przy użyciu kodu Pan Martelli przewidziane, a wyniki były istotnie lepsze teraz:
pomyślałem, że wyliczyć wnioski z wątku tutaj:
1) Dużo kodu w zakresie modułu jest zły pomysł,, nawet jeśli kod jest zamknięty w bloku if __name__ == "__main__":
.
2) * Co ciekawe, modyfikowania kodu, który należał do thebadone
do mojego niewłaściwej wersji (y pozwalając rosnąć bez resetowania) produkowane małą różnicę w wydajności, nawet dla większych wartości M i N.
Twój czas jest błędny, tak myślę. Przeprowadź wiele prób i być może wykonuj jakieś obliczenia, aby pozbyć się jakiejkolwiek możliwej optymalizacji z pętli. – Yuliy
+1 Bardzo interesujące pytanie. Po przeczytaniu odpowiedzi Martinellego pytanie to jest dla mnie jeszcze bardziej interesujące, ponieważ pokazuje subtelne różnice między przywoływaniem fragmentu kodu wewnątrz i na zewnątrz funkcji. – OscarRyz
-1: Ponieważ podstawą pytania był zasadniczo niepoprawny kod, proszę zamknąć pytanie. –