Die heutige Kolumne Python-Video-Tutorial wird Ihnen subtile Kenntnisse in Python erklären, aber darin steckt enorme Energie.
Wenn wir jeden Tag Python verwenden, müssen wir oft eine Liste erstellen, ich glaube, jeder kennt es, oder?
# 方法一:使用成对的方括号语法list_a = []# 方法二:使用内置的 list()list_b = list()复制代码
Welche der beiden oben genannten Schreibweisen verwenden Sie häufig? Haben Sie jemals über ihre Unterschiede nachgedacht?
Kommen wir gleich zur Sache und stellen die Frage dieses Artikels: Welche der beiden Möglichkeiten, eine Liste zu erstellen, [] und list(), ist schneller?
Hinweis: Um das Problem zu vereinfachen, nehmen wir als Beispiel für die Analyse die Erstellung einer leeren Liste. Weitere Einführungs- und Verwendungsanweisungen zu Listen finden Sie in diesem Artikel.
Verwenden Sie für die erste Frage den Timeit des timeit
-Moduls ()-Funktion kann leicht berechnet werden: 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()")复制代码
Wie in der Abbildung oben gezeigt, dauert die Erstellungsmethode [] bei jeweils 10 Millionen Aufrufen nur 0,47 Sekunden, während die Erstellungsmethode list( ) nur 0,47 Sekunden dauert dauert 1,75 Sekunden, letzteres dauert also 3,7-mal so lange wie ersteres!
🎜Dies beantwortet die Frage gerade: 🎜Beim Erstellen einer leeren Liste ist [] viel schneller als list(). 🎜🎜🎜🎜Hinweis: Die Effizienz der Funktion timeit() hängt von der Betriebsumgebung ab und die Ergebnisse jeder Ausführung unterscheiden sich geringfügig. Ich habe mehrmals mit der Python-Version 3.8 experimentiert und insgesamt ist [] etwas mehr als dreimal schneller als list(). 🎜🎜dis
verwenden, um den Unterschied zwischen den von den beiden ausgeführten Bytecodes zu sehen: 🎜rrreee🎜🎜🎜Wie in der Abbildung oben gezeigt, verfügt der Bytecode von [] über zwei Anweisungen (BUILD_LIST und RETURN_VALUE), während der Bytecode von list() über drei Anweisungen (LOAD_NAME, CALL_FUNCTION und RETURN_VALUE) verfügt.
Was bedeuten diese Anweisungen? Wie kann man sie verstehen?
Zuallererst handelt es sich bei [] um eine Reihe von Literalen in Python, die wie Literale wie Zahlen exakte feste Werte darstellen.
Mit anderen Worten: Wenn Python es analysiert, weiß es, dass es sich um eine Liste handelt, und ruft daher direkt die Listenerstellungsmethode im Interpreter (entsprechend BUILD_LIST) auf, um die Liste zu erstellen. Dies geschieht also in einem Schritt.
Für list() ist „list“ nur ein gebräuchlicher Name, kein Literal, was bedeutet, dass der Interpreter ihn zunächst nicht erkennt.
Der erste Schritt für den Interpreter besteht also darin, den Namen zu finden (entsprechend LOAD_NAME). Es wird in jedem Bereich nacheinander in einer bestimmten Reihenfolge (lokaler Bereich – globaler Bereich – integrierter Bereich) gesucht, bis er gefunden wird. Wenn er nicht gefunden wird, wird NameError
ausgegeben. NameError
。
解释器看到“list”之后是一对圆括号,因此第二步是把这个名称当作可调用对象来调用,即把它当成一个函数进行调用(对应 CALL_FUNCTION)。
因此,list() 在创建列表时,需要经过名称查找与函数调用两个步骤,才能真正开始创建列表(注:CALL_FUNCTION 在底层还会有一些函数调用过程,才能走到跟 BUILD_LIST 相通的逻辑,此处我们忽略不计)。
至此,我们就可以回答前面的问题了:因为 list() 涉及的执行步骤更多,因此它比 [] 要慢一些。
看完前两个问题的解答过程,你也许觉得还不够过瘾,而且可能觉得就算知道了这个冷知识,也不会有多大的帮助,似乎那微弱的提升显得微不足道。
但是,我们Python猫
Wenn list() eine Liste erstellt, muss es daher zwei Schritte der Namenssuche und des Funktionsaufrufs durchlaufen, bevor es tatsächlich mit der Erstellung der Liste beginnen kann (Hinweis: CALL_FUNCTION muss auch einige Funktionsaufrufprozesse auf der untersten Ebene erreichen die gleiche Logik wie BUILD_LIST , wir ignorieren sie hier).
An dieser Stelle können wir die vorherige Frage beantworten:Da list() mehr Ausführungsschritte umfasst, ist es langsamer als [].
Allerdings ist die von Python Cat
produzierte Serie „Warum Python“ schon immer dem unermüdlichen Geist der Wissenssuche treu geblieben, und es ist unmöglich, diese Frage unbeantwortet zu lassen.
Außerdem fiel mir aufgrund meiner Angewohnheit des divergenten Denkens eine weitere interessante Frage ein:
Kann die Geschwindigkeit von list() verbessert werden?Ich habe vor nicht allzu langer Zeit einen Artikel geschrieben, in dem dieses Problem besprochen wurde. Das heißt, in der gerade veröffentlichten Python 3.9.0-Version wird ein schnelleres Vektoraufrufprotokoll für list() implementiert, sodass die Ausführungsgeschwindigkeit sicher verbessert wird.An dieser Stelle haben wir eine Reihe von Fragen beantwortet. Wenn Sie es nützlich finden, liken und unterstützen Sie es bitte! Begrüßen Sie alle dazu, in Zukunft auf spannendere Inhalte zu achten. 🎜🎜🎜🎜Verwandte kostenlose Lernempfehlungen: 🎜🎜🎜Python-Video-Tutorial🎜🎜🎜🎜Interessierte Schüler können auf der offiziellen Python-Website Version 3.9 herunterladen. Laut meinen mehreren Testrunden dauert das 10-Millionen-fache Ausführen von list() in der neuen Version etwa 1 Sekunde, was dem Doppelten der Zeit entspricht, die zum Ausführen von [] benötigt wird, verglichen mit fast dem Vierfachen der vorherigen Daten. Die aktuelle Version hat sich im Allgemeinen stark verbessert.
Das obige ist der detaillierte Inhalt vonSchwierigkeiten: Was ist schneller, Python [] oder list()? Warum schnell? Wie viel schneller?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!