Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 22, 2010 10:52:03

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Как найти длину в списке

sum(map(int, str(123456)))



Офлайн

#2 Сен. 22, 2010 13:04:04

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как найти длину в списке

Не люблю map.
Оно, конечно, быстрее немного. Но легче читать запись i for i in …



Офлайн

#3 Сен. 22, 2010 13:38:20

maxwell
От:
Зарегистрирован: 2008-08-26
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

Как найти длину в списке

Андрей Светлов, какое быстрее? Вы все в строку переводите инт. Что-уж там…



Офлайн

#4 Сен. 22, 2010 14:06:29

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как найти длину в списке

maxwell
Есть очень интересный ньюанс.
Создание фрейма - дорогая операция.
Я померял - вариант Ed на timeit занимает 5.6, тогда как мой 7.3
Знаю почему.
Если желаете поговорить о том, что в Питоне быстро, а что медленно - буду рад.
Только, пожалуйста, создайте новую тему.



Офлайн

#5 Сен. 22, 2010 14:53:07

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

Как найти длину в списке

Вероятно, трудно будет придумать адекватную и интересную тему, не привязанную к этому контексту.
В принципе, тут будет преждевременная оптимизация, портящая наглядность, но “сишные” способы будут быстрее.

Например (вероятно, не самые красивые способы):

def calc_numbers1(number):
res = 0
divisor = 1
while divisor < number:
res += (number % (divisor*10)) // (divisor)
divisor *= 10
return res

def calc_numbers2(number):
res = 0
while number:
res += number % 10
number //= 10
return res
У меня вышло так:
первый способ 3.38
второй способ 2.09
способ с map и преобразованиями - 8.95



Офлайн

#6 Сен. 22, 2010 15:15:49

maxwell
От:
Зарегистрирован: 2008-08-26
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

Как найти длину в списке

Kogrom, описанные вами способы самые адекватные.
И, главное, заставляют «думать».



Офлайн

#7 Сен. 22, 2010 15:21:07

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Как найти длину в списке

def andrej(number):
return sum(int(i) for i in str(number))

def ed(number):
return sum(map(int, str(number)))

def calc_numbers1(number):
res = 0
divisor = 1
while divisor < number:
res += (number % (divisor*10)) // (divisor)
divisor *= 10
return res

def calc_numbers2(number):
res = 0
while number:
res += number % 10
number //= 10
return res

def calc_numbers3(number):
res = 0
while number:
res = res + number % 10
number = number // 10
return res
In [3]: timeit andrej(1234567)
100000 loops, best of 3: 9.15 us per loop

In [4]: timeit ed(1234567)
100000 loops, best of 3: 8.54 us per loop

In [5]: timeit calc_numbers1(1234567)
100000 loops, best of 3: 3.19 us per loop

In [6]: timeit calc_numbers2(1234567)
100000 loops, best of 3: 2.02 us per loop

In [7]: timeit calc_numbers3(1234567)
100000 loops, best of 3: 2.03 us per loop



Отредактировано (Сен. 22, 2010 15:21:27)

Офлайн

#8 Сен. 22, 2010 15:27:52

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Как найти длину в списке

def digit_sum(n):
s = str(n)
return sum(map(ord, s)) - len(s)*ord('0')
примерно в два раза быстрее варианта с int вместо ord
Желательно тестировать с длинными числами, скажем 10-20 знаков



Отредактировано (Сен. 22, 2010 15:40:54)

Офлайн

#9 Сен. 22, 2010 15:32:02

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

Как найти длину в списке

maxwell, моё мнение - наиболее адекватен способ от Ed, ибо наиболее лаконичен.

Zubchick, я не понял, к чему этот пример.



Офлайн

#10 Сен. 22, 2010 15:37:35

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Как найти длину в списке

Kogrom
Zubchick, я не понял, к чему этот пример.
да так, мне казалось на пару вызовов меньше должно быть,а вышло на оборот. А остальные так для общей картины.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version