Форум сайта python.su
Собственно здесь хотелось бы обсудить неожиданные результаты замеров, или просто поделиться опытом.
У меня следующий код:
from datetime import datetime
import psyco
psyco.full()
n = 1000000
def f1():
return [x+2 for x in range(n)]
def f2():
result = []
for x in range(n):
result.append(x+2)
return result
def f3():
result = []
for x in range(n):
result += [x+2]
return result
t = datetime.now()
f1()
print datetime.now() - t
t = datetime.now()
f2()
print datetime.now() - t
t = datetime.now()
f3()
print datetime.now() - t
Офлайн
а вот результаты без использования psyco
0:00:00.219000
0:00:00.313000
0:00:00.563000
PS: в данном тесте я заменил range на xrange
Отредактировано (Авг. 6, 2008 08:20:47)
Офлайн
собственно добавил четвертую функцию такого вида:
def f4():
result = [0]*n
for x in xrange(n):
result[x] = x+2
return result
Отредактировано (Авг. 6, 2008 13:31:10)
Офлайн
далее меня всегда интересовала производительность функции max
сначала я протестил следующий код:
from datetime import datetime
import psyco
psyco.full()
n = 10000000
def f1(l):
result = None
for x in l:
result = x if x > result else result
return result
def f2(l):
result = None
for x in l:
result = x > result and x or result
return result
def formList():
result = [0]*n
for x in xrange(n):
result[x] = x+2
return result
l = formList()
t = datetime.now()
max(l)
print datetime.now() - t
t = datetime.now()
f1(l)
print datetime.now() - t
t = datetime.now()
f2(l)
print datetime.now() - t
Отредактировано (Авг. 6, 2008 14:11:44)
Офлайн
далее упростим
следующая функция vs sum на миллионе значений:
def f1(l):
result = 0
for x in l:
result += x
return result
Отредактировано (Авг. 6, 2008 14:17:16)
Офлайн
кстати, заметил интересную вещь, касающуюся реализации max
почему-то max на убывающей последовательности из десяти миллионов значений стабильно был быстрее max на возрастающей примерно на 20%
результаты корректной проверки:
straight 0.53332 0.52626 0.53145 0.53093 sec/repeat in 10 repeats
reversed 0.51684 0.51587 0.51563 0.51735 sec/repeat in 10 repeats
решайте сами :)
Отредактировано (Авг. 6, 2008 14:23:43)
Офлайн
Далее производительность filter
n = 1000000
m = 100
def fc(x):
return x > m
def f1(l):
return filter(fc, l)
def f2(l):
return filter(lambda x: x > m, l)
def f3(l):
result = []
for x in l:
if x > m:
result.append(x)
return result
def f4(l):
result = [0] * len(l)
i = 0
for x in l:
if x > m:
result[i] = x
i += 1
return result[:i]
def f4_1(l):
result = [0] * len(l)
i = 0
for j in xrange(len(l)):
if l[j] > m:
result[i] = l[j]
i += 1
return result[:i]
def f5(l):
result = [0] * len(l)
for i in xrange(len(l)):
if l[i] > m:
result[i] = l[i]
return filter(None, result)
def f6(l):
for i in reversed(xrange(len(l))):
if l[i] > m:
del l[i]
return l
def f6():
result = l[:]
for i in reversed(xrange(len(result))):
if result[i] > m:
del result[i]
return result
Отредактировано (Авг. 6, 2008 14:55:02)
Офлайн
те же самые замеры соответственно, с m = 999900:
0:00:00.625000 f1
0:00:00.641000 f2
0:00:00.015000 f3
0:00:00.031000 f4
0:00:00.032000 f4_1
0:00:00.062000 f5
0:00:00.031000 f6
и
0:00:00.219000 f1
0:00:00.235000 f2
0:00:00.093000 f3
0:00:00.110000 f4
0:00:00.156000 f4_1
0:00:00.172000 f5
0:00:00.109000 f6
примерно можно представить какой алгоритм использует filter
корректные результаты:
psy&gc gc psyco clean
f1 0.23873 0.23442 0.22950 0.23179 sec/repeat in 10 repeats
f2 0.22903 0.22862 0.23583 0.22768 sec/repeat in 10 repeats
f3 0.01497 0.09107 0.01454 0.09062 sec/repeat in 10 repeats
f4 0.02838 0.10480 0.02876 0.10493 sec/repeat in 10 repeats
f4_1 0.03013 0.18873 0.03004 0.17896 sec/repeat in 10 repeats
f5 0.06586 0.21534 0.06629 0.21646 sec/repeat in 10 repeats
f6 0.06526 0.15384 0.06502 0.15343 sec/repeat in 10 repeats
результаты использования filter с psyco оказались несколько другие, так как в модуле был выключен psyco и он пытался обработать функции используемые в фильтре. Но думаю и с таким результатом целесообразность использования filter более чем очевидна
Отредактировано (Авг. 6, 2008 14:57:41)
Офлайн
Афтар жёш давай ещё !!! :)
Офлайн
evgenyl
а что жжешь?
интересные, кстати, вещи, результатов многих замеров банально не ожидал
Офлайн