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

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

14.02.2013, 11:49. Показов 6880. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru