Форум сайта python.su
857
Budulianinты меня удивляешь всё больше и больше
Какой там код? Тесты на бумаге пишутся, а потом значение в ассерты подставляются, для сравнения
Офлайн
33
py.user.nextЧто смешного?
ты меня удивляешь всё больше и больше
ну, отскань бумагу, пришли картинку, поугараем
Отредактировано Budulianin (Окт. 29, 2013 23:17:35)
Офлайн
47
py.user.nextя не про скорость, а про миллиард элементов
смотри замеры
Офлайн
857
bismigalisскорость одна и та же, это о чём говорит ?
я не про скорость, а про миллиард элементов
Отредактировано py.user.next (Окт. 30, 2013 14:19:31)
Офлайн
47
py.user.nextэто ничего не говорит о потребляемой памяти
это о чём говорит ?
Офлайн
33
bismigalis
Список из миллиарда целых чисел - это чуть меньше 16ГБ памяти на 32-х битной системе.
64ГБ - не самый большой объем RAM нужно установить на машину как для задачи, в которой фигурируют такие данные, чтобы все манипуляции производились только в памяти :)
Это с точки зрения инженерного решения невыдуманной и неучебной задачи.
Иначе нужно еще раньше подумать о сортировке такого кол-ва элементов ;)
Но в целом, конечно, вы правы. Копирование, а оно есть в обоих вариантах, таких объемов увеличит получаемые тайминги.
Но, все равно они, имхо, останутся сравнимыми.
py.user.nextТолько о том, что над конечной копией выполняются почти одни и те же операции.
скорость одна и та же, это о чём говорит ?
Офлайн
857
Lexander
Список из миллиарда целых чисел - это чуть меньше 16ГБ памяти на 32-х битной системе.
>>> 1000000000 * 4 / 1048576 / 1024 3.725290298461914 >>>
Lexanderво-во, а если итератор даёт одно время и срез даёт это же время, то никакой разницы нет, потому что происходит одно и то же
Только о том, что над конечной копией выполняются почти одни и те же операции.
bismigalisтак ты и не уменьшишь потребление
это ничего не говорит о потребляемой памяти
Lexanderну, по идее-то, срез должен сначала создать копию части списка, а потом для неё выполнить iter(), а itertools.islice() просто должен взять первый элемент и проверить для него условия, переданные при создании итератора (а iter() как бы вообще ничего не делает, потому itertools.islice() просто self возвращает)
Итератор содержит ссылку на итерируемый объект, но не копирует дополнительно его внутри.
Отредактировано py.user.next (Окт. 30, 2013 21:30:31)
Офлайн
33
py.user.nextВ Питоне все - объекты. Уже исходя из этого будет больше. ;)
3.7GiB - сами числа
Офлайн
47
вообще миллиард элементов это много, мало компьютеров поместят это в памяти
давайте говорить про миллион элементов
поставил эту штуку https://pypi.python.org/pypi/memory_profiler/0.30
на вход подаю range(10**6) #python2
версия py.user.next
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)
Офлайн
47
короче
for x in lst[1:]:
Офлайн