it-swarm.com.de

Verlangsamen Kommentare eine interpretierte Sprache?

Ich frage dies, weil ich Python verwende, aber es könnte auch für andere interpretierte Sprachen gelten (Ruby, PHP, JavaScript).

Verlangsame ich den Interpreter, wenn ich einen Kommentar in meinem Code hinterlasse? Nach meinem begrenzten Verständnis eines Interpreters werden Programmausdrücke als Zeichenfolgen eingelesen und anschließend in Code konvertiert. Es scheint, dass jedes Mal, wenn ein Kommentar analysiert wird, Zeit verschwendet wird.

Ist das der Fall? Gibt es eine Konvention für Kommentare in interpretierten Sprachen oder ist der Effekt vernachlässigbar?

61
Mantas Vidutis

Bei Python werden die Quelldateien vor der Ausführung kompiliert (die .pyc-Dateien) und die Kommentare werden dabei entfernt. Kommentare könnten die Kompilierungszeit verlangsamen, wenn Sie eine Unmenge davon haben, aber sie haben keinen Einfluss auf die Ausführungszeit.

72
Luper Rouch

Nun, ich habe ein kurzes Python-Programm geschrieben:

for i in range (1,1000000):
    a = i*10

Die Idee ist, eine einfache Berechnung viele Male durchzuführen.

Zu diesem Zeitpunkt dauerte der Lauf 0,35 ± 0,01 Sekunden.

Ich habe es dann mit der ganzen King James Bibel umgeschrieben, die so eingefügt wurde:

for i in range (1,1000000):
    """
The Old Testament of the King James Version of the Bible

The First Book of Moses:  Called Genesis


1:1 In the beginning God created the heaven and the earth.

1:2 And the earth was without form, and void; and darkness was upon
the face of the deep. And the Spirit of God moved upon the face of the
waters.

1:3 And God said, Let there be light: and there was light.

...
...
...
...

Even so, come, Lord Jesus.

22:21 The grace of our Lord Jesus Christ be with you all. Amen.
    """
    a = i*10

Diesmal dauerte der Lauf 0,4 ± 0,05 Sekunden.

Die Antwort lautet also ja . 4 MB Kommentare in einer Schleife machen einen messbaren Unterschied.

23
Rich Bradshaw

Kommentare werden normalerweise in oder vor der Analysephase entfernt, und die Analyse ist sehr schnell, sodass Kommentare die Initialisierungszeit nicht verlangsamen.

19
kennytm

Habe ein Skript wie Richs mit einigen Kommentaren geschrieben (nur ca. 500kb Text):

# -*- coding: iso-8859-15 -*-
import timeit

no_comments = """
a = 30
b = 40
for i in range(10):
    c = a**i * b**i
"""
yes_comment = """
a = 30
b = 40

# full HTML from http://en.wikipedia.org/
# wiki/Line_of_succession_to_the_British_throne

for i in range(10):
    c = a**i * b**i
"""
loopcomment = """
a = 30
b = 40

for i in range(10):
    # full HTML from http://en.wikipedia.org/
    # wiki/Line_of_succession_to_the_British_throne

    c = a**i * b**i
"""

t_n = timeit.Timer(stmt=no_comments)
t_y = timeit.Timer(stmt=yes_comment)
t_l = timeit.Timer(stmt=loopcomment)

print "Uncommented block takes %.2f usec/pass" % (
    1e6 * t_n.timeit(number=100000)/1e5)
print "Commented block takes %.2f usec/pass" % (
    1e6 * t_y.timeit(number=100000)/1e5)
print "Commented block (in loop) takes %.2f usec/pass" % (
    1e6 * t_l.timeit(number=100000)/1e5)


C:\Scripts>timecomment.py
Uncommented block takes 15.44 usec/pass
Commented block takes 15.38 usec/pass
Commented block (in loop) takes 15.57 usec/pass

C:\Scripts>timecomment.py
Uncommented block takes 15.10 usec/pass
Commented block takes 14.99 usec/pass
Commented block (in loop) takes 14.95 usec/pass

C:\Scripts>timecomment.py
Uncommented block takes 15.52 usec/pass
Commented block takes 15.42 usec/pass
Commented block (in loop) takes 15.45 usec/pass

Bearbeiten nach Davids Kommentar:

 -*- coding: iso-8859-15 -*-
import timeit

init = "a = 30\nb = 40\n"
for_ = "for i in range(10):"
loop = "%sc = a**%s * b**%s"
historylesson = """
# <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
# blah blah...
# --></body></html> 
"""
tabhistorylesson = """
    # <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    # blah blah...
    # --></body></html> 
"""

s_looped = init + "\n" + for_ + "\n" + tabhistorylesson + loop % ('   ','i','i')
s_unroll = init + "\n"
for i in range(10):
    s_unroll += historylesson + "\n" + loop % ('',i,i) + "\n"
t_looped = timeit.Timer(stmt=s_looped)
t_unroll = timeit.Timer(stmt=s_unroll)

print "Looped length: %i, unrolled: %i." % (len(s_looped), len(s_unroll))

print "For block takes %.2f usec/pass" % (
    1e6 * t_looped.timeit(number=100000)/1e5)
print "Unrolled it takes %.2f usec/pass" % (
    1e6 * t_unroll.timeit(number=100000)/1e5)


C:\Scripts>timecomment_unroll.py
Looped length: 623604, unrolled: 5881926.
For block takes 15.12 usec/pass
Unrolled it takes 14.21 usec/pass

C:\Scripts>timecomment_unroll.py
Looped length: 623604, unrolled: 5881926.
For block takes 15.43 usec/pass
Unrolled it takes 14.63 usec/pass

C:\Scripts>timecomment_unroll.py
Looped length: 623604, unrolled: 5881926.
For block takes 15.10 usec/pass
Unrolled it takes 14.22 usec/pass
5
Nick T

Der Effekt ist für den täglichen Gebrauch vernachlässigbar. Es ist leicht zu testen, aber wenn Sie eine einfache Schleife in Betracht ziehen, wie zum Beispiel:

For N = 1 To 100000: Next

Ihr Computer kann dies (bis zu 100.000) schneller verarbeiten, als Sie blinken können. Das Ignorieren einer Textzeile, die mit einem bestimmten Zeichen beginnt, ist mehr als 10.000-mal schneller.

Mach dir keine Sorgen.

4
NibblyPig

Dies hängt davon ab, wie der Interpreter implementiert ist. Die meisten modernen Interpreter bearbeiten den Quellcode zumindest ein wenig vor der eigentlichen Ausführung. Dazu gehört, dass die Kommentare entfernt werden, damit sie ab diesem Zeitpunkt keinen Unterschied mehr machen.

Zu einer Zeit, als der Speicher stark eingeschränkt war (z. B. insgesamt 64 KB adressierbarer Speicher und Kassettenbänder zur Speicherung), konnte man solche Dinge nicht für selbstverständlich halten. Zu Zeiten von Apple II, Commodore PET, TRS-80 usw. war es für Programmierer ziemlich Routine, Kommentare (und sogar Leerzeichen) explizit zu entfernen, um die Ausführungsgeschwindigkeit zu verbessern. Dies war auch nur einer von vielen Hacks auf Quellcode-Ebene, die zu dieser Zeit routinemäßig eingesetzt wurden1.

Natürlich half es auch, dass diese Maschinen CPUs hatten, die jeweils nur einen Befehl ausführen konnten, Taktraten um 1 MHz hatten und nur 8-Bit-Prozessorregister hatten. Sogar eine Maschine, die nur in einem Müllcontainer zu finden ist, ist so viel schneller als diese, dass es nicht einmal lustig ist ...


1. In einem anderen Beispiel können Sie in Applesoft eine gewisse Geschwindigkeit gewinnen oder verlieren, je nachdem, wie Sie die Zeilen nummeriert haben. Wenn der Speicher belegt ist, war der Geschwindigkeitsgewinn, als das Ziel einer goto-Anweisung ein Vielfaches von 16 war.

4
Jerry Coffin

Das Einfügen von Kommentaren verlangsamt die Startzeit, da die Skripte in eine ausführbare Form geparst werden. In den meisten Fällen verlangsamen Kommentare die Laufzeit jedoch nicht.

Außerdem können Sie in Python die .py-Dateien in .pyc kompilieren, die keine Kommentare enthalten (ich hoffe). Dies bedeutet, dass Sie auch dann keinen Start-Hit erhalten, wenn das Skript bereits kompiliert ist.

1
MarkR

Mein begrenztes Verständnis eines Interpreters besteht darin, dass er Programmausdrücke als Zeichenfolgen einliest und diese Zeichenfolgen in Code umwandelt.

Die meisten Interpreten lesen den Text (Code) und erstellen eine abstrakte Syntaxbaum-Datenstruktur.
Diese Struktur enthält keinen Code in Textform und natürlich auch keine Kommentare. Nur dieser Baum reicht aus, um Programme auszuführen. Aus Effizienzgründen gehen Interpreter jedoch noch einen Schritt weiter und produzieren Byte-Code. Und genau das macht Python.

Wir könnten sagen, dass der Code und die Kommentare in der Form, in der Sie sie geschrieben haben, einfach nicht vorhanden sind.
wenn das Programm läuft. Nein, Kommentare verlangsamen die Programme zur Laufzeit nicht.

(*) Dolmetscher, die keine andere innere Struktur zur Darstellung des Codes als Text verwenden,
dh ein Syntaxbaum muss genau das tun, was Sie erwähnt haben. Interpretieren Sie den Code zur Laufzeit immer wieder.

1

Ich frage mich, ob es darauf ankommt, wie Kommentare verwendet werden. Dreifache Anführungszeichen sind beispielsweise eine Dokumentzeichenfolge. Wenn Sie sie verwenden, wird der Inhalt überprüft. Ich bin vor einiger Zeit auf ein Problem gestoßen, als ich eine Bibliothek in meinen Python 3-Code importierte ... Ich habe diesen Fehler in Bezug auf die Syntax von\N erhalten. Ich habe mir die Zeilennummer angesehen und sie war in einem Kommentar mit drei Anführungszeichen enthalten. Ich war etwas überrascht. Neu in Python, hätte ich nie gedacht, dass ein Blockkommentar für Syntaxfehler interpretiert werden würde.

Einfach, wenn Sie Folgendes eingeben:

'''
(i.e. \Device\NPF_..)
'''

Python 2 gibt keinen Fehler aus, aber Python 3 meldet: SyntaxError: (Unicode-Fehler) 'Unicodeescape'-Codec kann an Position 14-15 keine Bytes dekodieren: Escape-Zeichen für ungültiges\N

Daher interpretiert Python 3 das dreifache Anführungszeichen offensichtlich und stellt sicher, dass es eine gültige Syntax hat.

Wenn es sich jedoch um einen einzeiligen Kommentar handelt: # (d. H.\Device\NPF_ ..)
Keine Fehlerergebnisse.

Ich frage mich, ob die Triple-Quote-Kommentare durch einzelne Zeilen ersetzt wurden, wenn eine Leistungsänderung zu sehen wäre.

0
continuousqa

Wie die anderen Antworten bereits sagten, analysiert und kompiliert eine moderne interpretierte Sprache wie Python den Quellcode zunächst in Bytecode, und der Parser ignoriert die Kommentare einfach. Dies bedeutet eindeutig, dass ein Geschwindigkeitsverlust nur beim Start auftritt, wenn die Quelle tatsächlich analysiert wird.

Da der Parser Kommentare ignoriert, wird die Kompilierungsphase im Wesentlichen nicht von den eingegebenen Kommentaren beeinflusst. Die Bytes in den Kommentaren selbst werden jedoch tatsächlich eingelesen und beim Parsen übersprungen. Dies bedeutet, dass Sie den Interpreter verlangsamen, wenn Sie eine verrückte Anzahl von Kommentaren haben (z. B. viele Hundert Megabyte). Andererseits würde dies auch jeden Compiler verlangsamen.

0
MAK

Diese Frage ist wirklich alt, aber nachdem ich die akzeptierte Antwort gelesen habe, die behauptet, dass sie sich nicht auf die Ausführungszeit auswirkt, was falsch ist, gebe ich Ihnen ein einfaches Beispiel, in dem Sie sehen und überprüfen können, wie stark sie die Ausführungszeit tatsächlich beeinflusst.
Ich habe eine Datei mit dem Namen constants.py. Es enthält alle verschiedenen Schachaktionen in einer Liste:

LABELS = [ "a1b1"
    "a1c1", 
    "a1d1", 
    "a1e1", 
    "a1f1",....]

Die Liste LABELS enthält 2272 Elemente. In einer anderen Datei rufe ich auf:

import constants
np.array(constants.LABELS)

Ich habe es zehnmal gemessen und die Ausführung des Codes dauert ca. 0,597 ms. Jetzt habe ich die Datei geändert und neben jedem Element (2272 mal) einen Kommentar eingefügt:

LABELS = [ "a1b1",  # 0 
            "a1c1", # 1
            "a1d1", # 2
            "a1e1", # 3
            "a1f1", # 4
             ...,
            "[email protected]", # 2271]

Nachdem ich nun die Ausführungszeit von np.array(constants.LABELS) zehnmal gemessen habe, habe ich eine durchschnittliche Ausführungszeit von 4,28 ms, also ungefähr siebenmal langsamer.
Daher wirkt es sich auf die Ausführungszeit aus, wenn Sie viele Kommentare haben.

0
Code Pope