Я довольно смущен выделениями объектов Python в памяти. Кажется, что распределение предопределенных типов не ведет себя последовательно. Вот продукт моих размышлений по этому вопросу:Python: Оптимизация управления памятью Непоследовательность?
a = None
b = None
print(a, b is a) # it outputs True, one single instance of None
a = 'a'
b = 'a'
print(a, b is a) # it outputs True, one single instance of a string
a = 2
b = 2
print(a, b is a) # it outputs True, one single instance of an int
a = 2.5
b = 2.5
print(a, b is a) # it outputs True, one single instance of a float
# from the python command line 'b is a' returns False
a = 'a b'
b = 'a b'
print(a, b is a) # it outputs True, one single instances of the same string
# from the python command line 'b is a' returns False
a =()
b =()
print(a, b is a) # it outputs True, one single instance of a()
a = {}
b = {}
print(a, b is a) # it outputs False, two different instances of the same empty {}
a = []
b = []
print(a, b is a) # it outputs False, two different instances of the same []
В id
возвращаемых значений для a
и b
показать, что оператор is
работает правильно, но алгоритм «память использование оптимизация», кажется, работает непоследовательно.
Являются ли последние два вывода print
и поведение интерпретатора командной строки python, обнаруживая некоторые ошибки реализации, или Python должен вести себя таким образом?
Я провел эти тесты в OpenSUSE 13.1 env. с Python 2.7.6 и Python 3.3.5 (по умолчанию, 27 марта 2014, 17:16:46) [GCC] на Linux.
Помимо различий в выходе между командной строкой и программой, в чем причина такого типа оптимизации? Я думаю, что довольно оптимистично предположить, что программы будут экономить более 10% памяти в среднем, если мы не рассмотрим особые случаи, которые должны управляться непосредственно программистом.
Помогло ли такое поведение эффективно минимизировать фрагментацию памяти?
Смотрите также: http://stackoverflow.com/ q/15541404/3001761, http://stackoverflow.com/q/21203212/3001761 о строках. – jonrsharpe