С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/35: Рейтинг темы: голосов - 35, средняя оценка - 4.74
 Аватар для GennDALF
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68

Кэширование малых чисел в Python

14.02.2013, 11:49. Показов 6850. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Есть список, в списке могут содержаться числа от 0 до ~30. Прохожу по списку, поочередно вывожу элементы в текстовый файл. Между элементами должен выводиться разделитель ', ', в конце '; '. Но числа могут повторяться. А я в итоге могу получить в файле строку типа '1; 4, 17, 1; 2, 3, 1;', что естественно меня не устраивает. Но в случае малых чисел переменные ссылаются на один и тот же объект, а значит проверка == и is ничем в плане результата отличаться не будет =(
Python
1
2
3
4
5
>>> l = [1,2,3,1]
>>> l[0] == l[-1]
True
>>> l[0] is l[-1]
True
Собственно, вопрос: можно ли как-то без использования range выполнить проверку является ли рассматриваемое число последним в списке?
Python
1
2
3
4
5
for number in number_list:
    if number is not number_list[-1]:
        print(number, end=', ')
    else:
        print(number, end='; ')
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.02.2013, 11:49
Ответы с готовыми решениями:

Кэширование данных словаря, python
Пользователь вводит в цикле целые положительные числа, пока не введет число 0. Для каждого числа вычисляется квадратный корень (с...

Кэширование в psp (Python Server Pages)
Добрый день. Как происходит кэширование в psp? index.py from mod_python import psp def index(req): req.content_type =...

Вычисление арктангенса малых чисел
Привет всем! программировать я только учусь. мне необходимо вычислить значение atan(2^(-x)) в пределах x=0,...,2048 где-то до1100...

15
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
14.02.2013, 14:19
Цитата Сообщение от GennDALF Посмотреть сообщение
Но в случае малых чисел переменные ссылаются на один и тот же объект
это откуда взято ?

Добавлено через 2 минуты
Цитата Сообщение от GennDALF Посмотреть сообщение
что естественно меня не устраивает
а что нужно ?
0
 Аватар для GennDALF
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
14.02.2013, 14:51  [ТС]
Цитата Сообщение от accept Посмотреть сообщение
это откуда взято ?
Из Лутца и IDLE - из последнего скопировал же пример. Из Лутца могу процитировать:
Цитата Сообщение от Марк Лутц - Изучаем Python, 4-е издание, 2011, стр. 204
>>> X = 42
>>> Y = 42 # Должно получиться два разных объекта
>>> X == Y
True
>>> X is Y # Тот же самый объект: кэширование в действии!
True


В этом примере переменные X и Y должны быть равны (==, одно и то же
значение), но не эквивалентны (is, один и тот же объект), потому что было
выполнено два разных литеральных выражения. Однако из-за того, что малые целые
числа и строки кэшируются и используются повторно, оператор is сообщает,
что переменные ссылаются на один и тот же объект.
Цитата Сообщение от accept Посмотреть сообщение
а что нужно ?
Цитата Сообщение от GennDALF Посмотреть сообщение
поочередно вывожу элементы списка в текстовый файл, между элементами должен выводиться разделитель ', ', в конце '; '
Вроде все написано было... Если угодно, то предыдущую строку надо получить в следующем виде: '1, 4, 17, 1, 2, 3, 1;' вместо '1; 4, 17, 1; 2, 3, 1;'

Повторюсь, я знаю как решить проблему с помощью range, но мне интересно, можно ли обойтись без него. Можно считать, что интерес не только теоретический, но и практический - этот элемент программы будет работать в нескольких вложенных циклах при анализе многотысячного списка и не хотелось бы грузить его еще и range-ем
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
15.02.2013, 03:09
Цитата Сообщение от GennDALF Посмотреть сообщение
Из Лутца и IDLE - из последнего скопировал же пример. Из Лутца могу процитировать:
ясно, это подходит для общего развития, но строить программы, исходя из этого, нельзя
если что-то не описано в спецификации, то оно может измениться и написанная программа перестанет правильно работать

Цитата Сообщение от GennDALF Посмотреть сообщение
надо получить в следующем виде: '1, 4, 17, 1, 2, 3, 1;'
Python
1
2
3
4
5
lst = [1, 4, 17, 1, 2, 3, 1]
 
with open('file.txt', 'w', encoding='utf-8') as fout:
    text = ', '.join(map(str, lst)) + ';'
    print(text, file=fout)
Code
1
2
3
[guest@localhost tmp]$ cat file.txt 
1, 4, 17, 1, 2, 3, 1;
[guest@localhost tmp]$
1
13 / 14 / 2
Регистрация: 16.02.2010
Сообщений: 99
15.02.2013, 03:39
я думаю range не оч. много потянет в производительности, если беспокоитесь о производительности, то лучше пишите код на си, кот. должен быстро работать
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
16.02.2013, 14:31
Цитата Сообщение от accept Посмотреть сообщение
это откуда взято ?
http://docs.python.org/2/c-api... t_FromLong

Настораживает, правда, фраза «the current implementation».
0
 Аватар для GennDALF
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
16.02.2013, 18:29  [ТС]
Цитата Сообщение от accept Посмотреть сообщение
ясно, это подходит для общего развития, но строить программы, исходя из этого, нельзя
если что-то не описано в спецификации, то оно может измениться и написанная программа перестанет правильно работать
Положим, пример я все-таки проверил и убедился, что работает как написано. Так почему бы мне не исходить из этого при написании программы? Разве released версии меняются?
За код спасибо - надо мне получше изучить встроенные функции.

2Nameless One,
А почему настораживает? "The current implementation" в Вашей ссылке, наверное, относится к 2.7.3. Для версии, которую использую я, прописано аналогично: http://docs.python.org/release... g_FromLong
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
16.02.2013, 18:57
Цитата Сообщение от GennDALF Посмотреть сообщение
А почему настораживает? "The current implementation" в Вашей ссылке, наверное, относится к 2.7.3. Для версии, которую использую я, прописано аналогично: http://docs.python.org/release... g_FromLong
Это значит, что в версии 3.x.y такое поведение может внезапно измениться. Да и реализаций питона больше, чем одна.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.02.2013, 07:04
Цитата Сообщение от GennDALF Посмотреть сообщение
Положим, пример я все-таки проверил и убедился, что работает как написано.
например, ты написал программу и она работает где-нибудь, проходит год, там версию питона обновляют, а программа-то та же самая, и она начинает неправильно работать
а теперь представь, что у тебя не одна такая программа, и использован не один такой "хак"
0
3 / 3 / 2
Регистрация: 21.10.2011
Сообщений: 50
17.02.2013, 13:05
А зачем такие сложности заложены в языке, неужели так сильно экономит память? Ведь Python ориентирован на лёгкость в применении, а тут такие камни.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
18.02.2013, 02:51
Цитата Сообщение от nivs Посмотреть сообщение
Ведь Python ориентирован на лёгкость в применении
а что, разве его трудно применять ?
для применения можно и не знать про то, что он кеширует числа

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> x = 1000000000
>>> y = 1000000000
>>> id(x), id(y)
(3075303392, 3075303376)
>>> 
>>> x = 1000000
>>> y = 1000000
>>> id(x), id(y)
(3075303712, 3075303392)
>>> 
>>> x = 100
>>> y = 100
>>> id(x), id(y)
(136594864, 136594864)
>>>
приведи пример, когда нужно знать эти различия
0
 Аватар для GennDALF
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
18.02.2013, 08:58  [ТС]
Цитата Сообщение от accept Посмотреть сообщение
приведи пример, когда нужно знать эти различия
Все-таки я не соглашусь. Пример, вообще-то, висит в шапке этой темы - если человек не знает о существовании такого явления как кэширование, то может написать неудачный блок кода, который будет неправильно работать.

Но даже не это главное, а главное все-таки то, что, по моему скромному убеждению, механику языка знать надо. Иначе, получится "пишу то - не знаю что, не знаю как" - а при таком раскладе напрашивается явно еще и "не знаю зачем". Я, например, иногда жалею, что в программировании я самоучка - несмотря на то, что это было взвешенное решение.
Как бы то ни было, знать о таких различиях надо - хотя бы для "общего развития".
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
18.02.2013, 09:40
Цитата Сообщение от GennDALF Посмотреть сообщение
Пример, вообще-то, висит в шапке этой темы
ну, тогда расшифруй пример из шапки темы, а то мне вообще непонятно, про что он

проверять равенство чисел через is - явно неправильно, можешь поинтересоваться в http://mail.python.org/mailman... ython-list
0
 Аватар для GennDALF
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
18.02.2013, 10:17  [ТС]
Цитата Сообщение от accept Посмотреть сообщение
тогда расшифруй пример из шапки темы, а то мне вообще непонятно, про что он
Цитата Сообщение от accept Посмотреть сообщение
проверять равенство чисел через is - явно неправильно
Не чисел, а элементов списка.

Итак, еще раз. Задача: вывод элементов списка с разделителем ', ', в конце '; '. Про map() я не знаю. Первое и самое элементарное, что мне пришло в голову:
Python
1
2
3
4
5
6
lst = [1, 4, 17, 1, 2, 3, 1]
for number in lst:
    if number != lst[-1]:
        print(number, end=', ', file=tmb_data_out)
    else:
        print(number, end='; ', file=tmb_data_out)
Естественно этот пример будет выдавать '1; 4, 17, 1; 2, 3, 1;', вместо '1, 4, 17, 1, 2, 3, 1;'.


И вот тогда можно было бы заменить проверку равенства на проверку is:
Python
1
2
3
4
5
6
lst = [1, 4, 17, 1, 2, 3, 1]
for number in lst:
    if number is not lst[-1]:
        print(number, end=', ', file=tmb_data_out)
    else:
        print(number, end='; ', file=tmb_data_out)
Но в случае малых чисел под единицу выделяется только один объект, одна и та же область памяти, на которую ссылаются разные элемента списка. Следовательно, в данной ситуации, такая проверка приведет к точно такому же результату, как и в предыдущем случае.
А если бы в списке присутствовали числа со значениями > 256 или < -5, то результирующая строка могла бы приобрести черт знает какой вид.

Оно понятно, что через map() все намного проще и заморачиваться на тему кэширования необходимости нет. Но пример такой имеет место быть.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
18.02.2013, 11:22
Цитата Сообщение от GennDALF Посмотреть сообщение
Не чисел, а элементов списка.
а, теперь понятно
ты хочешь отследить последний элемент списка по его хешу, сравнивая хеш текущего элемента с хешем последнего элемента

в списке находятся константы (целочисленные литералы), и код строится на том, как они хранятся, но это дело произвольное (то есть может меняться в разных версиях), поэтому код на их хешах строить нельзя

Python
1
2
3
4
5
6
7
8
9
10
11
12
>>> lst = [1, 4, 17, 1, 2, 3, 1]
>>> length = len(lst)
>>> for i in range(length):
...     number = lst[i]
...     if i + 1 < length:
...         print(number, end=', ')
...     else:
...         print(number, end=';')
...         print()
... 
1, 4, 17, 1, 2, 3, 1;
>>>
это с учётом незнания map()
0
3 / 3 / 2
Регистрация: 21.10.2011
Сообщений: 50
18.02.2013, 12:36
В шапке была оговорка - не используя range(), так-то понятно.

На счёт знания механики - безусловно нужно. У меня как-то мир поехал, когда copy.copy() сработал некорректно со списком с списке - вложенный список полученного с помощью copy.copy() объекта оказывался тем же вложенным объектом, что и у оригинала:
Python
1
2
3
4
5
6
7
>>> import copy
>>> first = [["11", "22", "33"]]
>>> second = copy.copy(first)
>>> second is first
False
>>> second[0] is first[0]
True
А всё потому, что нормально не прочитал механику работы. Отделался copy.deepcopy()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.02.2013, 12:36
Помогаю со студенческими работами здесь

Сложение малых чисел (меньше 1)
Нужно сложить определенное количество членов числового ряда. Например, такого: s = sum(1/n), где n число от 1 до 100. Понятно, что...

Автоматическое (через VBA) преобразование больших и малых чисел в математический формат
Подскажите как (я так понимаю что скорее с помощью VBA) преобразовать числа вида 1,25Е-10 в формат 1,25×10-10 2,365Е+05 в формат...

Это тест Рабина Миллера, но при вводе даже простых малых чисел выводит составное
все, с этим разобрались, теперь вопрос следующий - ПОЧЕМУ КВАДРАТЫ ЧИСЕЛ ОНО ВЫБИВАЕТ как простые? подскажите кто в теме (например я вбиваю...

Python Задан массив чисел в двоичной системе счисления. Упорядочить элементы массива по убыванию. Определить сумму чисел
Задан массив чисел в двоичной системе счисления. Упорядочить элементы массива по убыванию. Определить сумму чисел. Python

Кэширование
Люди добрые, имеется сайт... Сделан давольно грубо, на пхп, но большая часть кода в нём html`ная, а на пхп потому что в некоторых местах...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru