Budulianinты меня удивляешь всё больше и больше
Какой там код? Тесты на бумаге пишутся, а потом значение в ассерты подставляются, для сравнения
ну, отскань бумагу, пришли картинку, поугараем
Budulianinты меня удивляешь всё больше и больше
Какой там код? Тесты на бумаге пишутся, а потом значение в ассерты подставляются, для сравнения
py.user.nextЧто смешного?
ты меня удивляешь всё больше и больше
ну, отскань бумагу, пришли картинку, поугараем
py.user.nextя не про скорость, а про миллиард элементов
смотри замеры
bismigalisскорость одна и та же, это о чём говорит ?
я не про скорость, а про миллиард элементов
py.user.nextэто ничего не говорит о потребляемой памяти
это о чём говорит ?
py.user.nextТолько о том, что над конечной копией выполняются почти одни и те же операции.
скорость одна и та же, это о чём говорит ?
Lexander
Список из миллиарда целых чисел - это чуть меньше 16ГБ памяти на 32-х битной системе.
>>> 1000000000 * 4 / 1048576 / 1024 3.725290298461914 >>>
Lexanderво-во, а если итератор даёт одно время и срез даёт это же время, то никакой разницы нет, потому что происходит одно и то же
Только о том, что над конечной копией выполняются почти одни и те же операции.
bismigalisтак ты и не уменьшишь потребление
это ничего не говорит о потребляемой памяти
Lexanderну, по идее-то, срез должен сначала создать копию части списка, а потом для неё выполнить iter(), а itertools.islice() просто должен взять первый элемент и проверить для него условия, переданные при создании итератора (а iter() как бы вообще ничего не делает, потому itertools.islice() просто self возвращает)
Итератор содержит ссылку на итерируемый объект, но не копирует дополнительно его внутри.
py.user.nextВ Питоне все - объекты. Уже исходя из этого будет больше. ;)
3.7GiB - сами числа
Line # Mem usage Increment Line Contents ================================================ 3 39.9 MiB 0.0 MiB @profile 4 def convert_any_order(lst): 5 39.9 MiB 0.0 MiB fmt = '{}:{}' 6 39.9 MiB 0.0 MiB lst.sort() 7 39.9 MiB 0.0 MiB out = [] 8 39.9 MiB 0.0 MiB prev, inrange, first = lst[0], False, 0 9 47.5 MiB 7.6 MiB for x in lst[1:]: 10 47.5 MiB 0.0 MiB if prev + 1 != x: 11 if inrange: 12 inrange = False 13 out.append(fmt.format(first, prev)) 14 else: 15 out.append(str(prev)) 16 47.5 MiB 0.0 MiB elif not inrange: 17 47.5 MiB 0.0 MiB inrange, first = True, prev 18 47.5 MiB 0.0 MiB prev = x 19 39.9 MiB -7.6 MiB if inrange: 20 39.9 MiB 0.0 MiB out.append(fmt.format(first, prev)) 21 else: 22 out.append(str(prev)) 23 39.9 MiB 0.0 MiB return out
Line # Mem usage Increment Line Contents ================================================ 3 39.8 MiB 0.0 MiB @profile 4 def f(lst): 5 39.9 MiB 0.0 MiB lst.sort() 6 39.9 MiB 0.0 MiB res = [] 7 39.9 MiB 0.0 MiB tmp = [] 8 126.0 MiB 86.1 MiB for item, nextitem in zip(lst, lst[1:]+[None]): 9 126.0 MiB 0.0 MiB tmp.append(item) 10 126.0 MiB 0.0 MiB if nextitem is None or nextitem - item != 1: 11 126.0 MiB 0.0 MiB if len(tmp) > 1: 12 126.0 MiB 0.0 MiB res.append(tmp) 13 else: 14 res.extend(tmp) 15 126.0 MiB 0.0 MiB tmp = [] 16 17 126.0 MiB 0.0 MiB out = [] 18 126.0 MiB 0.0 MiB for item in res: 19 126.0 MiB 0.0 MiB if isinstance(item, list): 20 126.0 MiB 0.0 MiB out.append("{}:{}".format(item[0], item[-1])) 21 else: 22 out.append(str(item)) 23 126.0 MiB 0.0 MiB print ', '.join(out)
for x in lst[1:]: