170 похожих чатов

При использовании list comprehension, что питон делает с памятью? То есть,

он resizes array несколько раз (при достаточном кол-ве элементов для тригерра) как при вызывании метода .append(), или же он сразу выделяет память на все элементы?

66 ответов

49 просмотров

ну он не может сразу узнать сколько элементов будет

Illia- Автор вопроса
Tishka17
ну он не может сразу узнать сколько элементов буде...

почему? Обычно же в результате list comprehension выходит то же кол-во элементов, что и в начале (при условии отсутствия if)

Illia
почему? Обычно же в результате list comprehension ...

Допустим, ты делаешь список из генератора, сколько в нем будет элементов?

Illia
почему? Обычно же в результате list comprehension ...

Ну питон не может в общем случае знать сколько элементов итератор вернёт

Illia- Автор вопроса
Tishka17
в каком начале?

items = [1, 2, 3, 4, 5] doubled_items = [i*2 for i in items] Разве в этом случае он не может знать длину первого списка?

Illia
items = [1, 2, 3, 4, 5] doubled_items = [i*2 for i...

a = (1 for _ in range(10)) b = itertools.chain(a,a) c = [x for x in b]

Illia- Автор вопроса
Tishka17
a = (1 for _ in range(10)) b = itertools.chain(a,a...

Я же и не говорю, что он всегда будет знать - но в описаном мною случае он может узнать длину первоначального списка за О(1), так ведь? Но я понял, в моем случае лучше использовать linked list, спасибо

Illia
Я же и не говорю, что он всегда будет знать - но в...

что? при чем тут linked list? что ты хочешь сделать?

Illia- Автор вопроса
Tishka17
что? при чем тут linked list? что ты хочешь сделат...

У меня есть длинный список обьектов, в JSON формате (примерно): [{‘company_id’: 1, ‘module_name’: ‘abcde’, …}, {‘company_id’: 1, …}, {‘company_id’: 2, …}, {‘company_id’: 3, …}] Мне нужно эти обьекты сгрупировать по company_id и вернуть словарь где company_id будет ключ, а value будет любая iterable. Кстати, у меня список сортирован по company_id. Что насчет .slice()? Он тоже ресайзит список несколько раз, или он сразу выделяет нужное кол-во слотов памяти?

Illia- Автор вопроса
Максим Мартынов
А если там будет if?

Если там будет if, то интерпретатор будет знать, что там if, нет?

Illia
Если там будет if, то интерпретатор будет знать, ч...

Ну т.е. ты хочешь оптимизацию чисто для кейса [x*x for x in list], и все?

Illia- Автор вопроса
Tishka17
itertools.groupby

Спасибо. А если бы этой функции не существовало, просто ради понимания, linked list было бы правильно в этом случае использовать?

Illia
Спасибо. А если бы этой функции не существовало, п...

не вижу смысла в linkedlist тут. С непрерывной памятью работать проще.

Illia- Автор вопроса
Максим Мартынов
Ну т.е. ты хочешь оптимизацию чисто для кейса [x*x...

А этого мало? Если у меня в списке миллион элементов, это немаленький прирост даст

Illia- Автор вопроса
Максим Мартынов
А в for x in list: result.append(x*x) не даст

Это повод не оптимизировать один из двух use cases? Лист компрехеншн и так быстрее работает чем for loop, что в этом плохого?

Illia
Это повод не оптимизировать один из двух use cases...

https://peps.python.org/pep-0424/#rationale https://www.pythoninsight.com/2018/08/length-hints-in-python/ Но именно в comprehension не используется, похоже

Максим Мартынов
https://peps.python.org/pep-0424/#rationale https:...

у нас в расте итератор выдаёт верхнюю и нижнюю границу

Алиса Кассель-Королёва
я не понимаю твои волшебные слова

мне кажется когда ты пишешь про раст у него такое же

Алиса Кассель-Королёва
я не понимаю твои волшебные слова

ну там верхняя граница - это специальный объект, который нихрена не говорит о том, сколько там реально объектов

Tishka17
ну там верхняя граница - это специальный объект, к...

да нет, просто tuple[int, int | None], если по-питоновски https://doc.rust-lang.org/stable/std/iter/trait.Iterator.html#method.size_hint

Максим Мартынов
https://peps.python.org/pep-0424/#rationale https:...

https://discuss.python.org/t/simple-generators-should-have-len-or-length-hint-when-possible/18729/4

Алиса Кассель-Королёва
тогда верхний баунд None

а как сделать итератор по данным, которые мы на ходу генерируем и не знаем сколько будет?

Алиса Кассель-Королёва
да нет, просто tuple[int, int | None], если по-пит...

ну хинт это другое, это как если проверить __len__ у итератора, если есть, то вызвать и на него ориентироваться

Алиса Кассель-Королёва
опять None

ну то есть только в тривиальных случаях будет не None

Tishka17
ну то есть только в тривиальных случаях будет не N...

ну по умолчанию хинт (0, None) но можно его переопределить для своего итератора неправильный хинт не может привести к нарушению memory safety, просто код, использующий хинты, может работать неоптимально

Tishka17
ну то есть только в тривиальных случаях будет не N...

если ты реализуешь итератор по своей коллекции ты знаешь длину

Tishka17
a = (1 for _ in range(10)) b = itertools.chain(a,a...

такой код в расте бы даже не скомпилировался кстати

Максим Мартынов
Что на этот раз

chain требует владения обоими аргументами получить два владения над одним объектом в расте нельзя

Алиса Кассель-Королёва
chain требует владения обоими аргументами получить...

в питоне из-за таких приколов получается в итоге итератор из десяти элементов (хотя у обоих аргументов по десять элементов)

Алиса Кассель-Королёва
в питоне из-за таких приколов получается в итоге и...

Нет, у обоих аргуметов неизвестное число элементов

так у тебя repeat, а тут генераторное выражение

ну он просто максимум вернул

Tishka17
a = (1 for _ in range(10)) b = itertools.chain(a,a...

оно, кстати, выдыхается на первой итерации, я чет думал, что два раза повторится

какой то претти принт у вас не очень претти

Kivooeo Terrors
Не вижу здесь принта

макрос dbg! претти-принтит аргумент и возвращает его можно внутри выражения его вставить и увидеть значение какой-то части выражения, при этом не ломая код примерно def dbg[T](x: T) -> T: print(repr(x)) return x

По-моему в питоне лист — это буквально лист. Ну, то есть, связный список, поддерживающий индексацию, а не типизированный массив. Поэтому ты любой объект туда засунуть и можешь

Nikita K. K.
Пруфы?

https://docs.python.org/3/glossary.html#term-list

Алиса Кассель-Королёва
https://docs.python.org/3/glossary.html#term-list

«...больше похож на массив, чем на связанный список, поскольку доступ к элементам осуществляется за О(1)» — связный список с поддержкой индексов

Nikita K. K.
«...больше похож на массив, чем на связанный списо...

Там нет ссылки на следующий элемент и реализован он как массив

Nikita K. K.
«...больше похож на массив, чем на связанный списо...

https://github.com/python/cpython/blob/7f963bfc79a515dc9822ebddbfb1b5927d2dda09/Objects/listobject.c#L279-L305 похоже на связный список?

Daniil Cheremisin
Там нет ссылки на следующий элемент и реализован о...

Как тогда выделяется память под новый элемент? Допустим, один объект в списке — строка, другой — экземпляр класса с кучей вложенностей и данных, третий — int8, потом флоат, ещё дабл...

Nikita K. K.
Как тогда выделяется память под новый элемент? До...

Точно также как работают динамические массивы чего угодно где угодно. Хранятся указатели

Алиса Кассель-Королёва
https://github.com/python/cpython/blob/7f963bfc79a...

в частности 301-302 строки у связного списка не так реализуется вставка в произвольное место

Nikita K. K.
Как тогда выделяется память под новый элемент? До...

Память выделяется не под элемент. Память выделяется с запасом как и в любой другой реализации вектора

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта