오늘의 python 동영상 튜토리얼 칼럼은 파이썬에 대한 미묘한 지식을 설명하지만 엄청난 에너지를 담고 있습니다.
Python을 매일 사용하다 보면 목록을 작성해야 하는 경우가 많죠. 다들 익숙하실 텐데요.
# 方法一:使用成对的方括号语法list_a = []# 方法二:使用内置的 list()list_b = list()复制代码
두 가지 글쓰기 방법 중 어떤 것을 자주 사용하시나요? 그들의 차이점에 대해 생각해 본 적이 있습니까?
본론으로 들어가 이 글의 질문을 던져보겠습니다. 목록을 만드는 두 가지 방법인 []와 list() 중 어느 것이 더 빠른가요?
참고: 문제를 단순화하기 위해 분석의 예로 빈 목록 생성을 예로 듭니다. 목록에 대한 자세한 소개 및 사용법은 이 기사를 확인하세요
첫 번째 질문에는 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 倍多一点。
那么,我们继续来分析一下第二个问题:为什么 [] 会更快呢?
这一次我们可以使用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배 조금 더 빠릅니다. 🎜🎜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() 涉及的执行步骤更多,因此它比 [] 要慢一些。
看完前两个问题的解答过程,你也许觉得还不够过瘾,而且可能觉得就算知道了这个冷知识,也不会有多大的帮助,似乎那微弱的提升显得微不足道。
但是,我们Python猫
따라서 list()가 목록을 생성할 때 실제로 목록 생성을 시작하기 전에 이름 검색과 함수 호출의 두 단계를 거쳐야 합니다. BUILD_LIST 와 동일한 논리이므로 여기서는 무시합니다.)
이 시점에서 이전 질문에 답할 수 있습니다.list()에는 더 많은 실행 단계가 포함되므로 []보다 느립니다.
그러나 Python Cat
이 제작한 "Why Python" 시리즈는 언제나 지치지 않는 지식 탐구 정신을 고수해 왔으며 이 질문에 답하지 않을 수 없습니다.
게다가, 나의 확산적 사고 습관 때문에 또 다른 흥미로운 질문도 생각했습니다.
list()의 속도를 향상시킬 수 있습니까?얼마 전에 이 문제를 논의한 기사를 썼습니다. 즉, 방금 출시된 Python 3.9.0 버전에서는 list()에 대한 더 빠른 벡터 호출 프로토콜을 구현하므로 실행 속도가 향상됩니다.지금까지 일련의 질문에 답변해 드렸습니다. 도움이 되셨다면 좋아요와 응원 부탁드립니다! 앞으로 더욱 흥미로운 콘텐츠에 관심을 가져주시기 바랍니다. 🎜🎜🎜🎜관련 무료 학습 권장사항: 🎜🎜🎜python 비디오 튜토리얼🎜🎜🎜🎜관심 있는 학생은 Python 공식 웹사이트에서 버전 3.9를 다운로드할 수 있습니다. 여러 차례의 테스트 결과에 따르면 새 버전에서 list()를 1천만 번 실행하는 데 약 1초가 소요됩니다. 이는 []를 실행하는 데 걸리는 시간이 이전 버전의 거의 4배에 비해 2배 늘어난 것입니다. 현재 버전은 일반적으로 많이 개선되었습니다.
위 내용은 어려움: Python [] 또는 list() 중 어느 것이 더 빠릅니까? 왜 빨리요? 얼마나 더 빠르나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!