import datetime
def uloops(n=1000000000):
start = datetime.datetime.now()
for i in xrange(n):
d = 1+1
pass
end = datetime.datetime.now()
total = end - start
s = '%s loops in %s' % (n, total.seconds)
print (s)
uloops()
Запускаем на py2 и на pypy:
import datetime
def uloops(n=1000000000):
start = datetime.datetime.now()
for i in xrange(n):
d = 1+1
pass
end = datetime.datetime.now()
total = end - start
s = '%s loops in %s' % (n, total.seconds)
print (s)
uloops()
Traceback (most recent call last):
File "./p3.py", line 14, in <module>
uloops()
File "./p3.py", line 6, in uloops
for i in xrange(n):
NameError: name 'xrange' is not defined
Демонстрирует на сколько медленнее стали работать циклы в python 3 по сравнению с python 2
Ты, конечно, хотел сказать «насколько медленнее стали работать пустые циклы в Python 3». Да, знать это очень важно. Правда, цифры у меня получились другие, но мне и пример твой пришлось править.
Ну да, пустые, какая разница, что они будут содержать что либо, если уже даже фундамент в виде циклов тормозит. При чем медленнее стало не на какие-то там 1-2% а почти в два раза.
Правда, цифры у меня получились другие, но мне и пример твой пришлось править.
ну да, слегка надо подправить опечатку, с py3 убрать буковку x, анонимус уже жаловался.
Ну да, пустые, какая разница, что они будут содержать что либо
Разница в том, что простой вызов функции в цикле почти уравнивает быстродействие Python2 и Python3 (104 против 117). Это значит, что вызов функции в Python3 эффективнее.
фундамент в виде циклов тормозит
белки_истерички.жпг
медленнее стало не на какие-то там 1-2% а почти в два раза.
Разница в том, что простой вызов функции в цикле почти уравнивает быстродействие Python2 и Python3 (104 против 117). Это значит, что вызов функции в Python3 эффективнее.
Ок. Давай экспериментировать:
import datetime
def simple_funciton(x):
y = x
return y
def uloops(n=10000000):
start = datetime.datetime.now()
for i in range(n):
simple_funciton(i)
end = datetime.datetime.now()
total = end - start
result = total.microseconds
s = '%s loops in %s' % (n, result)
print (s)
return result
def test(times=10):
min_time = 999999999
max_time = 0
data = []
for i in range(times):
result = uloops()
data.append(result)
print('min: %s' % min(data))
print('max: %s' % max(data))
avg = sum(data)/times
print('avg: %s' % avg)
Результаты
Python 3.3.2:
min: 591045
max: 655035
avg: 627804.5
Python 2.7.5:
min: 273861
max: 365404
avg: 309640
Python 2.7.5 xrange:
min: 31981
max: 122711
avg: 65485
Что-то я не вижу уравнивание быстродействия. Не говоря уже о том, что в py3 xrange как бы по умолчанию
Хорошо, это серьезный аргумент. Но здесь я встану на место того анонимуса и скажу что питон не для таких задач, т.к. пока не могу представить задачу в которой мне пришлось бы сделать цикл на «2 ** 65» итераций, но прекрасно могу представить задачу где понадобиться сделать большое количество циклов на гораздо более меньшее количество итераций +)
Давай. Причем ничего не переписывая, никаких уверток:
import datetime
def foo(x, y):
return x+y
def uloops(n=1000000000):
start = datetime.datetime.now()
for i in xrange(n):
d = foo(1, 1)
pass
end = datetime.datetime.now()
total = end - start
s = '%s loops in %s' % (n, total.seconds)
print (s)
uloops()
Дело тут уже не в циклах, я просто придерживался той же задачи. Всё равно миллиард пустых итераций тоже вряд ли кому-то пригодится. Я просто хотел сказать, что полностью прозрачная работа с большими числами — это очень большое преимущество, по сравнению с которым скорость пустых циклов гораздо менее важна.
Ну с одной стороны да. Но с другой питон славился своим весьма неплохим быстродействием для скриптового ЯП. И я думаю что сменить 2 на 3 было бы особенно актуально, если бы там более деликатно подошли к этому вопросу. А то выходит получили несовместимости со многими программами, еще и работает медленнее.
З.ы. к стати костыль для цикла n=2 ** 65:
def big_range(n):
c = 0
while c != n:
yield c
c += 1
for i in big_range(2 ** 65): pass
Я на прошлой неделе вляпался в один проект на Пайтоне, но только вчера вкурил, что проектный мэйнстрим - двоечка. А уже наго*нокодил вагон и маленькую тележку.