Я розумію, що вони обоє по суті одне і те ж, але з точки зору стилю, який кращий (більш пітонічний) використовувати для створення порожнього списку чи дикту?
Я розумію, що вони обоє по суті одне і те ж, але з точки зору стилю, який кращий (більш пітонічний) використовувати для створення порожнього списку чи дикту?
Відповіді:
З точки зору швидкості, це не конкуренція за порожні списки / дикти:
>>> from timeit import timeit
>>> timeit("[]")
0.040084982867934334
>>> timeit("list()")
0.17704233359267718
>>> timeit("{}")
0.033620194745424214
>>> timeit("dict()")
0.1821558326547077
а для непорожніх:
>>> timeit("[1,2,3]")
0.24316302770330367
>>> timeit("list((1,2,3))")
0.44744206316727286
>>> timeit("list(foo)", setup="foo=(1,2,3)")
0.446036018543964
>>> timeit("{'a':1, 'b':2, 'c':3}")
0.20868602015059423
>>> timeit("dict(a=1, b=2, c=3)")
0.47635635255323905
>>> timeit("dict(bar)", setup="bar=[('a', 1), ('b', 2), ('c', 3)]")
0.9028228448029267
Крім того, використання позначень у дужках дозволяє використовувати описи списку та словника, що може бути достатньою причиною.
timeit()
функція повідомляє про загальну кількість часу для виконання заданої кількості ітерацій, яка 1000000
за замовчуванням. Отже, наведені вище приклади - це кількість секунд, щоб виконати фрагмент коду мільйон разів. Наприклад timeit('dict()', number=1) // -> 4.0531158447265625e-06
(одна ітерація) у той час timeit('dict()') // -> 0.12412905693054199
(мільйон ітерацій)
На мій погляд []
і{}
є найбільш віщий і машиночитаних способи створення порожніх списків / dicts.
Будьте обережні set()
, хоча, наприклад:
this_set = {5}
some_other_set = {}
Може заплутати. Перший створює набір з одним елементом, другий створює порожній дикт і не множину.
{}
завжди створює порожній дикт. {1,2,3}
створює набір в 2.7+, але є помилкою синтаксису у 2.6
та старших версіях.
some_epic_set
яка вказує на порожній dict
об'єкт ... це не порожній набір. Для порожнього набору потрібно використовувати set()
.
{5}
створює набір з одним елементом, 5
і {}
є порожнім висловом.
{*()}
порожній set
з буквальним синтаксисом. Я називаю це однооким оператором мавп. :-)
Диктує літерал може бути крихітними трохи швидше , так як його байткод коротше:
In [1]: import dis
In [2]: a = lambda: {}
In [3]: b = lambda: dict()
In [4]: dis.dis(a)
1 0 BUILD_MAP 0
3 RETURN_VALUE
In [5]: dis.dis(b)
1 0 LOAD_GLOBAL 0 (dict)
3 CALL_FUNCTION 0
6 RETURN_VALUE
Те ж стосується і list
vs[]
CALL_FUNCTION
займає щонайменше стільки ж часу, як BUILD_MAP
(функція, яка називається по суті, є BUILD_MAP
), і LOAD_GLOBAL
займає лише додаткові накладні витрати.
IMHO, використовуючи list()
і dict()
робить ваш Python схожим на C. Ugh.
У випадку різниці між [] та списком (), є підводний камінь, на який я ще не бачив, щоб хтось вказував. Якщо ви використовуєте словник як член списку, вони дадуть абсолютно різні результати:
In [1]: foo_dict = {"1":"foo", "2":"bar"}
In [2]: [foo_dict]
Out [2]: [{'1': 'foo', '2': 'bar'}]
In [3]: list(foo_dict)
Out [3]: ['1', '2']
[foo_dict]
за допомогою list((foo_dict,))
. list()
Метод приймає итератор , оскільки це єдиний параметр і ітерацію над ним , щоб додати елементи в список. Це спричинить подібний провал, виконуючи list(some_list)
який, вирівнюватиме список.
list () та [] працюють по-різному:
>>> def a(p=None):
... print(id(p))
...
>>> for r in range(3):
... a([])
...
139969725291904
139969725291904
139969725291904
>>> for r in range(3):
... a(list())
...
139969725367296
139969725367552
139969725367616
list () завжди створює новий об’єкт у купі, але [] може використовувати багато комірок пам'яті з багатьох причин.
є одна різниця в поведінці між [] та list (), як показано нижче в прикладі. нам потрібно використовувати list (), якщо ми хочемо повернути список номерів, інакше ми отримаємо об’єкт карти! Не знаю, як це пояснити.
sth = [(1,2), (3,4),(5,6)]
sth2 = map(lambda x: x[1], sth)
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>
sth2 = [map(lambda x: x[1], sth)]
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>
type(sth2) # list
type(sth2[0]) # map
sth2 = list(map(lambda x: x[1], sth))
print(sth2) #[2, 4, 6]
type(sth2) # list
type(sth2[0]) # int
Пара дужок поля позначає один із об’єктів списку або індексний індекс, мій_ список [x].
Фігурна дужка пара позначає об’єкт словника.
a_list = ['on', 'off', 1, 2]
a_dict = {on: 1, off: 2}
В основному це питання вибору більшість часу. Це питання переваги.
Однак зауважте, що якщо у вас є цифрові клавіші, наприклад, ви не можете:
mydict = dict(1="foo", 2="bar")
Ви повинні зробити:
mydict = {"1":"foo", "2":"bar"}
mydict = {1:"foo", 2:"bar"}
(без лапок для ключів).
list(i for i in range(10) if i % 2)