Даррен Томас дает хороший ответ. Однако одно большое различие между подходами Java и Python состоит в том, что при подсчете ссылок в общем случае (без циклических ссылок) объекты очищаются немедленно, а не в какой-то неопределенный более поздний срок.
Например, я могу написать неаккуратный непереносимый код в CPython, например
def parse_some_attrs(fname):
return open(fname).read().split("~~~")[2:4]
и дескриптор файла для этого файла, который я открыл, будет немедленно очищен, потому что, как только ссылка на открытый файл исчезнет, файл будет удален, а дескриптор файла освобожден. Конечно, если я запускаю Jython или IronPython или, возможно, PyPy, то сборщик мусора не обязательно будет работать намного позже; возможно, сначала у меня закончатся файловые дескрипторы, и моя программа потерпит крах.
Так что вы ДОЛЖНЫ писать код, который выглядит как
def parse_some_attrs(fname):
with open(fname) as f:
return f.read().split("~~~")[2:4]
но иногда людям нравится полагаться на подсчет ссылок, чтобы всегда освобождать свои ресурсы, потому что это может иногда сделать ваш код немного короче.
Я бы сказал, что лучшим сборщиком мусора является сборщик мусора с наилучшей производительностью, который в настоящее время выглядит как сборочные сборщики мусора в стиле Java, которые могут работать в отдельном потоке и имеют все эти безумные оптимизации и т. Д. Различия то, как вы пишете свой код, должно быть незначительным и в идеале не существующим.