2014-06-24 3 views
1

Я довольно смущен выделениями объектов 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% памяти в среднем, если мы не рассмотрим особые случаи, которые должны управляться непосредственно программистом.

Помогло ли такое поведение эффективно минимизировать фрагментацию памяти?

+0

Смотрите также: http://stackoverflow.com/ q/15541404/3001761, http://stackoverflow.com/q/21203212/3001761 о строках. – jonrsharpe

ответ

2

Разница здесь просто в том, что некоторые из этих объектов изменяемы, а некоторые неизменяемы.

Совершенно безопасно оптимизировать присвоения, например. строковые литералы, потому что две ссылки на один и тот же неизменяемый объект не вызовут никаких проблем. Поскольку вы не можете изменить объект на месте, любое изменение будет означать новый объект, отдельный для старого.

Однако с изменчивыми типами, например списками, вы можете столкнуться с проблемой, если вы установили a = b. Переменные объекты могут быть изменены на месте, поэтому в вашем примере списка все, что вы добавили к a, закончится в b и наоборот.

Поведение в интерпретаторе отличается (для небольших целых чисел, которые «интернированных», за исключением), так как эти оптимизации не осуществляются:

>>> a = "a b" 
>>> b = "a b" 
>>> a is b 
False 
+1

Вы можете добавить к своему сообщению пример [sys.intern] (https://docs.python.org/3.0/library/sys.html#sys.intern), чтобы показать, что если вы используете 'a = sys. intern ('a b'); b = sys.intern ('a b') 'Теперь' a is b' возвращает True для интернированной строки. – dawg

Смежные вопросы