>  기사  >  백엔드 개발  >  어려움: Python [] 또는 list() 중 어느 것이 더 빠릅니까? 왜 빨리요? 얼마나 더 빠르나요?

어려움: Python [] 또는 list() 중 어느 것이 더 빠릅니까? 왜 빨리요? 얼마나 더 빠르나요?

coldplay.xixi
coldplay.xixi앞으로
2020-10-26 18:02:111897검색

오늘의 python 동영상 튜토리얼 칼럼은 파이썬에 대한 미묘한 지식을 설명하지만 엄청난 에너지를 담고 있습니다.

어려움: Python [] 또는 list() 중 어느 것이 더 빠릅니까? 왜 빨리요? 얼마나 더 빠르나요?

Python을 매일 사용하다 보면 목록을 작성해야 하는 경우가 많죠. 다들 익숙하실 텐데요.

# 方法一:使用成对的方括号语法list_a = []# 方法二:使用内置的 list()list_b = list()复制代码

두 가지 글쓰기 방법 중 어떤 것을 자주 사용하시나요? 그들의 차이점에 대해 생각해 본 적이 있습니까?

본론으로 들어가 이 글의 질문을 던져보겠습니다. 목록을 만드는 두 가지 방법인 []와 list() 중 어느 것이 더 빠른가요?

참고: 문제를 단순화하기 위해 분석의 예로 빈 목록 생성을 예로 듭니다. 목록에 대한 자세한 소개 및 사용법은 이 기사를 확인하세요

1. []는 list()보다 3배 빠릅니다

첫 번째 질문에는 timeit 모듈의 timeit을 사용하세요. () 함수는 쉽게 계산할 수 있습니다: timeit模块的 timeit() 函数就能简单地测算出来:

>>> import timeit>>> timeit.timeit('[]', number=10**7)>>> timeit.timeit('list()', number=10**7)复制代码

如上图所示,在各自调用一千万次的情况下,[] 创建方式只花费了 0.47 秒,而 list() 创建方式要花费 1.75 秒,所以,后者的耗时是前者的 3.7 倍!

这就回答了刚才的问题:创建空列表时,[] 要比 list() 快不少。

注:timeit() 函数的效率跟运行环境相关,每次执行结果会有微小差异。我在 Python3.8 版本实验了几次,总体上 [] 速度是 list() 的 3 倍多一点。

2、list() 比 [] 执行步骤多

那么,我们继续来分析一下第二个问题:为什么 [] 会更快呢?

这一次我们可以使用dis

>>> from dis import dis>>> dis("[]")>>> dis("list()")复制代码

위 그림과 같이 각각 1,000만 번 호출했을 때 [] 생성 방법은 0.47초 밖에 걸리지 않지만 list( ) 생성 방법은 0.47초밖에 걸리지 않습니다. 1.75초가 걸리므로 후자는 전자보다 3.7배나 걸립니다!

🎜이 질문에 대한 답은 다음과 같습니다. 🎜빈 목록을 만들 때 []는 list()보다 훨씬 빠릅니다. 🎜🎜🎜🎜참고: timeit() 함수의 효율성은 운영 환경과 관련이 있으며 각 실행 결과는 약간씩 다릅니다. Python 3.8 버전에서 여러 번 실험했는데 전체적으로 []가 list()보다 3배 조금 더 빠릅니다. 🎜🎜

2. list()에는 []보다 더 많은 실행 단계가 있습니다. 🎜🎜그러면 두 번째 질문인 왜 []가 더 빠른지 분석해 보겠습니다. 🎜🎜이번에는 dis 모듈의 dis() 함수를 사용하여 두 모듈에 의해 실행되는 바이트코드 간의 차이점을 확인할 수 있습니다. 🎜rrreee🎜🎜🎜

위 그림과 같이 []의 바이트코드에는 2개의 명령어(BUILD_LIST 및 RETURN_VALUE)가 있고, list()의 바이트코드에는 3개의 명령어(LOAD_NAME, CALL_FUNCTION 및 RETURN_VALUE)가 있습니다.

이 지침은 무엇을 의미하나요? 그들을 이해하는 방법은 무엇입니까?

우선, []의 경우 Python의 리터럴 집합으로 숫자와 같은 리터럴과 마찬가지로 정확한 고정 값을 나타냅니다.

즉, Python이 구문 분석할 때 목록을 나타내는 것을 알기 때문에 인터프리터(BUILD_LIST에 해당)에서 목록 작성 메소드를 직접 호출하여 목록을 생성하므로 한 단계로 완료됩니다.

list()의 경우 "list"는 리터럴이 아닌 일반적인 이름일 뿐이므로 통역사가 처음에는 이를 인식하지 못한다는 의미입니다.

그래서 통역사의 첫 번째 단계는 이름(LOAD_NAME에 해당)을 찾는 것입니다. 각 범위를 특정 순서(로컬 범위 - 전역 범위 - 내장 범위)로 하나씩 검색하여 찾을 수 없으면 NameError가 발생합니다. NameError

解释器看到“list”之后是一对圆括号,因此第二步是把这个名称当作可调用对象来调用,即把它当成一个函数进行调用(对应 CALL_FUNCTION)。

因此,list() 在创建列表时,需要经过名称查找与函数调用两个步骤,才能真正开始创建列表(注:CALL_FUNCTION 在底层还会有一些函数调用过程,才能走到跟 BUILD_LIST 相通的逻辑,此处我们忽略不计)。

至此,我们就可以回答前面的问题了:因为 list() 涉及的执行步骤更多,因此它比 [] 要慢一些。

3、list() 的速度提升

看完前两个问题的解答过程,你也许觉得还不够过瘾,而且可能觉得就算知道了这个冷知识,也不会有多大的帮助,似乎那微弱的提升显得微不足道。

但是,我们Python猫

통역사는 "list" 뒤에 괄호 쌍이 오는 것을 확인하므로 두 번째 단계는 이 이름을 호출 가능한 객체로 호출하는 것입니다. 즉, 함수(CALL_FUNCTION에 해당)로 호출합니다.

따라서 list()가 목록을 생성할 때 실제로 목록 생성을 시작하기 전에 이름 검색과 함수 호출의 두 단계를 거쳐야 합니다. BUILD_LIST 와 동일한 논리이므로 여기서는 무시합니다.)

이 시점에서 이전 질문에 답할 수 있습니다.

list()에는 더 많은 실행 단계가 포함되므로 []보다 느립니다.

3. list() 속도가 향상되었습니다

처음 두 질문의 답변 과정을 읽어보니 만족스럽지 못하다고 느끼실 수도 있습니다. 그리고 그것을 안다고 생각할 수도 있겠지만, 이런 사소한 지식은 별로 도움이 되지 않을 것 같습니다. 약한 개선점은 미미해 보입니다.

그러나 Python Cat이 제작한 "Why Python" 시리즈는 언제나 지치지 않는 지식 탐구 정신을 고수해 왔으며 이 질문에 답하지 않을 수 없습니다.

게다가, 나의 확산적 사고 습관 때문에 또 다른 흥미로운 질문도 생각했습니다.

list()의 속도를 향상시킬 수 있습니까?

얼마 전에 이 문제를 논의한 기사를 썼습니다. 즉, 방금 출시된 Python 3.9.0 버전에서는 list()에 대한 더 빠른 벡터 호출 프로토콜을 구현하므로 실행 속도가 향상됩니다.

관심 있는 학생은 Python 공식 웹사이트에서 버전 3.9를 다운로드할 수 있습니다. 여러 차례의 테스트 결과에 따르면 새 버전에서 list()를 1천만 번 실행하는 데 약 1초가 소요됩니다. 이는 []를 실행하는 데 걸리는 시간이 이전 버전의 거의 4배에 비해 2배 늘어난 것입니다. 현재 버전은 일반적으로 많이 개선되었습니다.

지금까지 일련의 질문에 답변해 드렸습니다. 도움이 되셨다면 좋아요와 응원 부탁드립니다! 앞으로 더욱 흥미로운 콘텐츠에 관심을 가져주시기 바랍니다. 🎜🎜🎜🎜관련 무료 학습 권장사항: 🎜🎜🎜python 비디오 튜토리얼🎜🎜🎜🎜

위 내용은 어려움: Python [] 또는 list() 중 어느 것이 더 빠릅니까? 왜 빨리요? 얼마나 더 빠르나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.im에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제