В чем смысл обоснованного использования конструкторов цикла for i in xrange(...)
-style в Python? Для простых целых циклов разница в надбавке существенна. Я провел простой тест с использованием двух частей кода:
Файл 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
Файл 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
Результаты профилирования были следующими:
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
Я могу понять, почему версия Pythonic работает медленнее - я полагаю, что она имеет много общего с вызовом xrange N раз, возможно, это может быть устранено, если есть способ перемотать генератор. Однако с этой разницей во времени исполнения, почему вы предпочитаете использовать версию Pythonic?
Изменить: Я снова провел тесты, используя код, предоставленный г-ном Мартелли, и теперь результаты были действительно лучше:
Я думал, что перечислил выводы из этой темы:
1) Много кода в области модуля - плохая идея, даже если код заключен в блок if __name__ == "__main__":
.
2) * Любопытно, что изменение кода, принадлежащего thebadone
к моей неправильной версии (позволяя y расти без перезагрузки), создало небольшую разницу в производительности даже для больших значений M и N.