Ну я попробовал немного, и давайте посмотрим:
dct = {'four': 3, 'three': 2, 'two': 1, 'one': 0}
print(sys.getsizeof(dct)) # = 272
print(sys.getsizeof(dict(dct))) # = 272
print(sys.getsizeof({k: v for k, v in dct.items()})) # = 272
dct = {'four': 3, 'three': 2, 'five': 4, 'two': 1, 'one': 0}
print(sys.getsizeof(dct)) # = 272
print(sys.getsizeof(dict(dct))) # = 272
print(sys.getsizeof({k: v for k, v in dct.items()})) # = 272
dct = {'six': 5, 'three': 2, 'two': 1, 'four': 3, 'five': 4, 'one': 0}
print(sys.getsizeof(dct)) # = 1040
print(sys.getsizeof(dict(dct))) # = 656
print(sys.getsizeof({k: v for k, v in dct.items()})) # = 1040
dct = {'seven': 6, 'six': 5, 'three': 2, 'two': 1, 'four': 3, 'five': 4, 'one': 0}
print(sys.getsizeof(dct)) # = 1040
print(sys.getsizeof(dict(dct))) # = 656
print(sys.getsizeof({k: v for k, v in dct.items()})) # = 1040
dct = {'seven': 6, 'six': 5, 'three': 2, 'two': 1, 'four': 3, 'five': 4, 'eight': 7, 'one': 0}
print(sys.getsizeof(dct)) # = 656
print(sys.getsizeof(dict(dct))) # = 1040
print(sys.getsizeof({k: v for k, v in dct.items()})) # = 1040
Я не уверен, какая оптимизация происходит здесь, но я предполагаю, что это потому, что эти структуры используют различные «передовые методы». Я имею в виду, когда выделять сколько памяти для хеш-таблицы. Например, если у вас есть одиннадцать или более элементов, вы получите еще странное несоответствие:
dct = {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10:10, 11:11}
print(sys.getsizeof(dct)) # = 1808
print(sys.getsizeof(dict(dct))) # = 1040
print(sys.getsizeof({k: v for k, v in dct.items()})) # = 1040
Так что это, вероятно, просто какой-то потребление памяти «оптимизация» при создании словарей по-разному, почему это не монотонный останец для литерального синтаксиса при использовании 6 или 7 элементов: я не знаю. Может быть, некоторая оптимизация памяти пошла не так, и это ошибка, которая выделяет слишком много памяти? Я еще не прочитал исходный код.
https://github.com/python/cpython/blob/2.7/Objects /dictobject.c –