Ich möchte wissen, ob eine generierte Sequenz weniger als 2 Einträge hat.
%Vor%Meine ineffiziente Methode besteht darin, eine Liste zu erstellen und ihre Länge zu messen:
%Vor%Offensichtlich verbraucht dies den ganzen Generator.
In meinem realen Fall könnte der Generator ein großes Netzwerk durchqueren. Ich möchte die Überprüfung durchführen, ohne den gesamten Generator zu verbrauchen oder eine große Liste zu erstellen.
Es gibt ein Rezept in der itertools-Dokumentation :
%Vor% Dies erstellt nur eine Liste der maximalen Länge n
, was besser ist.
So könnte ich sagen:
%Vor%Gibt es eine noch pythischere, effizientere Art, das zu tun?
Die Lösung, die take
verwendet, verwendet islice
, erstellt eine Liste und nimmt die Länge davon an:
Um das Erstellen der Liste zu vermeiden, können wir sum
:
Dies dauert etwa 70% der Zeit:
%Vor%Einpacken:
%Vor% Ab Python 3.4 können Generatoren einen Längenhinweis implementieren. Wenn ein Generator dies implementiert, wird er durch die Methode Sie können es mit der Funktion Wenn nicht verfügbar ist, besteht Ihre einzige Option darin, Elemente zu konsumieren, und Ihre Verwendung des object.__length_hint__()
. operator.length_hint()
testen. take()
-Rezepts ist der effizienteste Weg, dies zu tun: