답변:
속도면에서 빈 목록 / 딕셔너리에 대한 경쟁이 아닙니다.
>>> 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
(1 회 반복) while 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
리터럴 구문으로 비워 두는 데 사용할 수 있습니다 . 나는 그것을 외눈 박이 원숭이 운영자라고 부릅니다. :-)
DICT의 문자가있을 수 있습니다 작은 그 바이트 코드가 짧은로 빠른 비트 :
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
대 에도 동일하게 적용됩니다.[]
CALL_FUNCTION
필요 이상으로 많은 시간과 같이 BUILD_MAP
(기능이 필수적이라는 것이다되는 BUILD_MAP
), 및 LOAD_GLOBAL
단지 추가적인 오버 헤드가 걸린다.
IMHO, 사용 list()
하고 dict()
Python을 C. Ugh처럼 보이게 만듭니다.
[]와 list ()의 차이의 경우 다른 사람이 지적하지 않은 함정이 있습니다. 사전을 목록의 구성원으로 사용하면 두 가지 결과가 완전히 다릅니다.
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()
메서드는 유일한 매개 변수이므로 iterable을 취하고 목록에 요소를 추가하기 위해 반복합니다. 이것은 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
상자 괄호 쌍은 목록 객체 또는 색인 아래 첨자 인 my_List [x] 중 하나를 나타냅니다.
중괄호 쌍은 사전 객체를 나타냅니다.
a_list = [ 'on', 'off', 1, 2]
a_dict = {켜기 : 1, 끄기 : 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)