Эти вопросы носят гипотетический характер и с учетом ответов и комментариев не очень ценятся. Если вы хотите получить представление о том, насколько эффективен тип списка, вы можете попробовать профилировать его самостоятельно.
В качестве отправной точки я указал небольшой скрипт:
from sys import getsizeof
from timeit import timeit
from random import randint
MIN_EXP, MAX_EXP = 1, 8 # list-size from 10^1 to 10^8 as default
TEST_ITERATIONS = 1
class ListTest(object):
def __init__(self, number, item):
self.number = number
self.item = item
self.size = '0'
self.time = 0.0
def test_01_creation_list_comprehension(self):
list_ = []
def profile():
list_ = [self.item for n in range(self.number)]
self.time = timeit(profile, number = TEST_ITERATIONS)
self.size = "%.3f" % (getsizeof(list_) / 1024.0,)
def test_02_creation_list_append(self):
list_ = []
def profile():
for n in range(self.number):
list_.append(self.item)
self.time = timeit(profile, number = TEST_ITERATIONS)
self.size = "%.3f" % (getsizeof(list_) / 1024.0,)
def test_03_find_item(self):
list_ = [self.item for n in range(self.number)]
searchstr = 'find me!'
list_[randint(0,self.number)] = searchstr
def profile():
foundya = list_.index(searchstr)
self.time = timeit(profile, number = TEST_ITERATIONS)
tests = [ListTest(10**n,'string-item') for n in range(MIN_EXP,MAX_EXP)]
for test in tests:
print "-"*78,"\nListTest with %d items:" % test.number
for subtest in [st for st in dir(test) if st.startswith('test_')]:
getattr(test, subtest)()
print "%15s" % "%s: %.4f s" % (subtest, test.time)
print "%32s" % "%s %14s %s" % ("Memory used:", test.size, "kB")
я получаю список с 10 миллионами записей этих результатов (100 миллионов не вычисляются с моими настройками памяти)
>>> ListTest with 10000000 items:
>>> test_01_creation_list_comprehension: 1.7200 s
>>> Memory used: 0.031 kB
>>> test_02_creation_list_append: 2.8455 s
>>> Memory used: 39808.621 kB
>>> test_03_find_item: 0.1657 s
>>> Memory used: 39808.621 kB
Использование памяти - это больше показатель величины, чем реальное потребление. Функция sys.getsizeof в основном корректна для стандартных типов, включает накладные расходы gc, но не работает хорошо для сложных объектов или внешних (внешних) объектов.