Найти - Пользователи
Полная версия: Как найти длину в списке
Начало » Python для новичков » Как найти длину в списке
1 2 3
Ed
sum(map(int, str(123456)))
Андрей Светлов
Не люблю map.
Оно, конечно, быстрее немного. Но легче читать запись i for i in …
maxwell
Андрей Светлов, какое быстрее? Вы все в строку переводите инт. Что-уж там…
Андрей Светлов
maxwell
Есть очень интересный ньюанс.
Создание фрейма - дорогая операция.
Я померял - вариант Ed на timeit занимает 5.6, тогда как мой 7.3
Знаю почему.
Если желаете поговорить о том, что в Питоне быстро, а что медленно - буду рад.
Только, пожалуйста, создайте новую тему.
Kogrom
Вероятно, трудно будет придумать адекватную и интересную тему, не привязанную к этому контексту.
В принципе, тут будет преждевременная оптимизация, портящая наглядность, но “сишные” способы будут быстрее.

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

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
maxwell
Kogrom, описанные вами способы самые адекватные.
И, главное, заставляют «думать».
Zubchick
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
Isem
def digit_sum(n):
s = str(n)
return sum(map(ord, s)) - len(s)*ord('0')
примерно в два раза быстрее варианта с int вместо ord
Желательно тестировать с длинными числами, скажем 10-20 знаков
Kogrom
maxwell, моё мнение - наиболее адекватен способ от Ed, ибо наиболее лаконичен.

Zubchick, я не понял, к чему этот пример.
Zubchick
Kogrom
Zubchick, я не понял, к чему этот пример.
да так, мне казалось на пару вызовов меньше должно быть,а вышло на оборот. А остальные так для общей картины.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB