Подсчет ссылок и сборка мусора в Python
26 ноября 2015 г.
Archy
Просмотров: 17575
RSS
Обсудить
Python для начинающих

Для всех объектов в программе Python ведется подсчет ссылок. Счетчик ссылок на объект увеличивается всякий раз, когда ссылка на объект записывается в новую переменную или когда объект помещается в контейнер, такой как список, кортеж или словарь, как показано ниже:
a = 37 # Создается объект со значением 37 b = a # Увеличивается счетчик ссылок на объект 37 c = [] c.append(b) # Увеличивается счетчик ссылок на объект 37
В этом примере создается единственный объект, содержащий значение 37. Переменная a, это всего лишь имя, ссылающееся переменной b, вслед чего b становится еще одним именем того же самого объекта, при этом счетчик ссылок на объект увеличивается на 1. Точно так же, когда переменная b помещается в список, счетчик ссылок увеличивается на единицу.
На протяжении всего примера существует только один объект, содержащий значение 37. Все остальные операции просто приводят к созданию новых ссылок на него.
Счетчик ссылок уменьшается, когда вызывается инструкция del или когда поток выполнения покидает область видимости ссылки(или при присваивании другого значения). Например:
del a # Уменьшает счетчик ссылок на объект 37 b = 42 # Уменьшает счетчик ссылок на объект 37 с[0] = 2.0 # Уменьшает счетчик ссылок на объект 37
Определить текущее количество ссылок на объект можно с помощью функции sys.getrefcount(). Например, создаем переменную Иван Франко которая будет ссылаться на строку «критика на творчество Франко».
>>> a = 37 >>> import sys >>> IvanFranko = "критика на творчество Франко" >>> length = len(IvanFranko) # длина строки >>> sys.getrefcount(IvanFranko) 2 >>> sys.getrefcount(length) 9 >>> length 28
Собственно, на Ubuntu все выглядит следующим образом:

Во многих случаях количество ссылок оказывается намного больше, чем можно было бы предположить. Для неизменяемых типах данных, таких как числа и строки, интерпретатор весьма активно стремится использовать в разных частях программы один и тот-же объект, чтобы уменьшить объем потребляемой памяти.
На сайте https://doctorsmm.com/ можно купить очень недорогие комментарии в Инстаграм к любому посту или нескольким публикациям сразу. При этом Вы вправе выбрать формат сообщений: рандомные, смайлы, живые или микс.
Когда счетчик ссылок на объект достигает нуля, он уничтожается сборщиком мусора. Однако в некоторых случаях могут возникать циклические зависимости между коллекциями объектов, которые больше не используются. Например:
a = <> b = <> a['b'] = b # a содержит ссылку на b b['a'] = a # b содержит ссылку на a del a del b
В этом примере инструкция del уменьшает счетчики ссылок на объекты a и b и уничтожает имена, ссылавшиеся на объекты в памяти. Однако поскольку объекты содержат ссылки друг на друга, счетчики ссылок не достигают нуля и объекты продолжают существовать(что приводит к утечке памяти).
Чтобы исправить эту проблему, интерпретатор периодически выполняет проверку наличия циклических зависимостей, отыскивает такие недоступные объекты и удаляет их. Механизм поиска циклических зависимостей запускается периодически, как только интерпретатор обнаруживает, что в процессе выполнения программы объем занимаемой памяти начинает расти. Точное поведение механизма может корректироваться и управляться с помощью функции из модуля gc.
Еще записи по теме
- Алгоритм расшифровки названии автомобилей в игре «Что за тачка?» на Python
- Наследование. Объектно-ориентированное программирование в Python
- Итерации и циклы в Python
- Как импортировать словарь в Lingualeo при помощи Python?
- Модуль shelve в Python — сохранение объектов в файл
- Python работа с FTP — Модуль ftplib
- Вложение декораторов в Python
Как открыть все ссылки из файла?
Есть файл с ссылками на сайт (пагинация не подходит)
Как пройтись по этим ссылкам, чтобы достать определенный элемент?
С помощью BeautifulSoup забрать элемент не проблема.
Не могу настроить цикл, чтобы проходилось по всем ссылкам, а не по одной.
- Вопрос задан более года назад
- 166 просмотров
Комментировать
Решения вопроса 1

Сергей Карбивничий @hottabxp Куратор тега Python
Сначала мы жили бедно, а потом нас обокрали..
Очень просто.
main.py:
import requests from bs4 import BeautifulSoup with open('links.txt') as file: links = file.read().splitlines() for link in links: response = requests.get(link) soup = BeautifulSoup(response.text, 'html.parser') print(soup.title)
https://qna.habr.com/q/1099328 https://qna.habr.com/q/1099326 https://qna.habr.com/q/1099320 https://qna.habr.com/q/1099316
Как удалить одинаковые ключи из словаря Python? — Хабр Q&A Как открыть все ссылки из файла? — Хабр Q&A Как отсортировать список файлов? — Хабр Q&A Как создать "перезапуск кода" на Python? — Хабр Q&A
Применение:
Разбить код на функции, добавить обработку ошибок по своему вкусу.
Ответ написан более года назад
Есть список ссылок. Необходимо пройтись по ссылкам и скачать их
Спасибо всем! Я поставил i перед добавлением в название файла: получается в выводе — zapis1.zip. И если я ставлю после увеличение — i+=1, то файл не пишется:
22 мая 2022 в 19:39
for url in li: i=1 r = requests.get(url, allow_redirects=True) for link in r: i += 1 open(f’zapis.zip’, ‘wb’).write(r.content)
22 мая 2022 в 19:53
Пишется только последняя ссылка:
22 мая 2022 в 19:55
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
import requests li = ["https://data.binance.vision/data/spot/daily/klines/BNBBTC/5m/BNBBTC-5m-2022-05-20.zip", "https://data.binance.vision/data/spot/daily/klines/BNBBTC/5m/BNBBTC-5m-2022-05-19.zip.CHECKSUM", "https://data.binance.vision/data/spot/daily/klines/BNBBTC/5m/BNBBTC-5m-2021-03-11.zip.CHECKSUM", "https://data.binance.vision/data/spot/daily/klines/BNBBTC/5m/BNBBTC-5m-2021-03-11.zip", "https://data.binance.vision/data/spot/daily/klines/BNBBTC/5m/BNBBTC-5m-2021-03-10.zip.CHECKSUM", "https://data.binance.vision/data/spot/daily/klines/BNBBTC/5m/BNBBTC-5m-2021-03-10.zip", "https://data.binance.vision/data/spot/daily/klines/BNBBTC/5m/BNBBTC-5m-2021-03-09.zip.CHECKSUM", "https://data.binance.vision/data/spot/daily/klines/BNBBTC/5m/BNBBTC-5m-2021-03-09.zip"] for url in li: name = url.split('/')[-1] r = requests.get(url, allow_redirects=True) print(f'zip\\') with open(f'zip\\', 'wb') as file: file.write(r.content) print('ГОТОВО')
Как получить все ссылки на странице сайта?
Как получить все ссылки на странице сайта с помощь командной строки? Или это нужно делать все на питоне? других вариантов нет? Если нет, что не желательно, то каким образом это можно организовать на питоне?
- Вопрос задан более года назад
- 811 просмотров
Комментировать
Решения вопроса 4

Владимир Куц @fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
Из командной строки:
curl https://yandex.ru | grep -o -E 'href=\".*?\"' | sed 's/href=\"//' | sed 's/\"//' | sort | uniq # //yandex.ru/opensearch.xml # //yastatic.net/jquery/2.1.4/jquery.min.js # https://afisha.yandex.ru/rostov-na-donu/cinema/cyrano-2022? utm_source=yamain&utm_medium=yamain_afisha_kp # https://afisha.yandex.ru/rostov-na-donu/cinema/dog-2021?utm_source=yamain&utm_medium=yamain_afisha_kp # https://afisha.yandex.ru/rostov-na-donu/cinema/kroletsyp-i-khomiak-tmy?utm_source=yamain&utm_medium=yamain_afisha_kp .
import io import requests from lxml import etree data = requests.get('https://yandex.ru').text parser = etree.HTMLParser() tree = etree.parse(io.StringIO(data), parser) for im in tree.xpath('//a'): print(im.get('href'))
Ответ написан более года назад
Нравится 3 1 комментарий
David It @David138 Автор вопроса
А если допустим страница — медиафал вордперсса, как в ней получить ссылки на загруженные файлы с командной строки?

Например так:
возможно понадобится добавить ключ -usebasicparsing в зависимости от версии powershell
Ответ написан более года назад
Нравится 1 3 комментария
David It @David138 Автор вопроса
Это я так понимаю на Винде. Есть впринципе винда на другой машине. Попробую
ну я не увидел требований что это на линуксе.
curl вполне справляется, с вытаскиванием ссылок — можно взять примеры у двух других отвечающих
David It @David138 Автор вопроса
Евгений, у повершела на букву I неадекватная реакция я смотрю?? не могу команду прописать — Invoke

Если нужно собрать именно линки посмотри в сторону requests-html сделан на базе requests. Фишка в том что может собрать все урлы со страницы и ещё много разных плюшек для ленивых)
Ответ написан более года назад
David It @David138 Автор вопроса
Вопрос ещё в том, а если в админке КМС рассмотреть случай. Например аналог Ворд пресса, без вмешательства админки в кмс, можно вывести ссылки файлов например в разделе медиа через командную строку или через питон?

David It, я не понял твой вопрос. КМС это что? CMS? Раздел медиа это что? Вывести можно все в командной строке или воспользоваться питоном для вывода в терминал.
David It @David138 Автор вопроса
Электо Хаус, да в cms есть раздел медиа, и там например папка и в ней файлы. Как мне вывести ссылки на эти файлы в папке с командной строки или питона?

David It, вариантов масса. Самый простой это зайти на сервак по ssh и сделать что типа ls -a1 /var/www/sitenime/img/foldername/
Тебе выведет список всех файлов по указанному пути. Скопируй и чуть поправь в любом редакторе.
Ещё можно написать скрипт на питоне который выведет тебе данные.
Можно написать более сложный скрипт на сокетах который соединятся и выведет данные.
Если данные доступны из вне на сайте. То можно спарсить их.
Если на сайте есть карта сайта xml можно ее распарсить и забрать нужные линки.
Если данные есть в дб можно запросить их там. Для этого есть тулза у питона. Или воспользоваться средствами ORM
Можно написать скрипт на баш
Можно написать на ps если под виндовс работаешь.
Как ты видишь вариантов масса!
Выбирай подходящий и юзай. Предполагаю ты знаешь питон, для парсинга нужен requests и bs4
Для написания скрипта хватит стандартных модулей питона.
Или ты хочешь получить готовый скрипт?
